diff --git a/.gitignore b/.gitignore
index f51b495c..64a33f50 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,10 +32,12 @@
 !Android.mk
 .*.sw?
 .DS_Store
+.android
 .cipd
 .classpath
 .code-coverage
 .cproject
+.emulator_sdk
 .gdb_history
 .gdbinit
 .landmines
diff --git a/DEPS b/DEPS
index 0f4f590..8d2bc78 100644
--- a/DEPS
+++ b/DEPS
@@ -162,11 +162,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': 'c712e962b64742f18fc69620678297bee144ea9b',
+  'skia_revision': '1585d7e108ef84b76646fb8bd9cc1f4673cbbb49',
   # 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': '121f6b791c3b0a6c6f6ae4c98b45746451320168',
+  'v8_revision': 'a2830ee1667928e8e1a7dbecface74cf4a7a8f78',
   # 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.
@@ -174,7 +174,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '096b08fa42e8e1635d7afb7047c3295d991d0982',
+  'angle_revision': 'd4c75347e4d386a3eed50d73a473621155d5fe16',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -182,7 +182,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '693460a3a7b74d8830a40808684d29876b3c13b9',
+  'pdfium_revision': 'f57843cb20ee8d7c38513d9a26ff5df54d796c7a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -297,7 +297,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': 'cf0e9d93f1775e75f17ad045c1e28d118f9fad1b',
+  'dawn_revision': '6ac5a9250dffe3a1d114f636a9c748ed22c5876e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -394,7 +394,7 @@
       'packages': [
           {
               'package': 'chromium/android_webview/tools/cts_archive',
-              'version': 'V3W65R48ryiA3ecaekbuWV3duqeF8A5U_Q07E2bAyVYC',
+              'version': '4kDr36wBuZtvbfaEin4U4oeFD7oAuN0flkWDImKBts4C',
           },
       ],
       'condition': 'checkout_android',
@@ -853,7 +853,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'edb189d40cb2f72273b10c0f94821b137bd4dbc4',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'd1d14229730202d83660c70b10b13cc29337b29a',
       'condition': 'checkout_linux',
   },
 
@@ -878,7 +878,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '7211cf64444c3cac9fba34d32ca35de31a96f545',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '6a5cb2517a2c219d303ab0ab2435f2e406738770',
 
   'src/third_party/devtools-node-modules':
     Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'),
@@ -1257,7 +1257,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '8adff0796b3103f21db1032b6a9eea9abcfea3ed',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '19ac30b02093130723556a4a3e779d5b539086b9',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1487,7 +1487,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@09aa96cf69bd07fa860f63717bf8706344cbe0c8',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@01c20b755102eb168b6ce8c0d3f7bf33ffdbceb7',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn
index 5d2454b..64307b76 100644
--- a/android_webview/BUILD.gn
+++ b/android_webview/BUILD.gn
@@ -89,16 +89,6 @@
   classes = [ "android/os/CancellationSignal.class" ]
 }
 
-java_cpp_enum("browser_enums") {
-  sources = [
-    "browser/aw_renderer_priority.h",
-    "browser/aw_settings.h",
-    "browser/permission/aw_permission_request.h",
-    "browser/safe_browsing/aw_safe_browsing_blocking_page.h",
-    "browser/safe_browsing/aw_url_checker_delegate_impl.h",
-  ]
-}
-
 jinja_template("system_webview_manifest") {
   input = "apk/java/AndroidManifest.xml"
   output = system_webview_android_manifest
@@ -467,294 +457,43 @@
 source_set("common") {
   sources = [
     "apk/webview_apk_application.cc",
-    "browser/android_protocol_handler.cc",
-    "browser/android_protocol_handler.h",
-    "browser/aw_autofill_client.cc",
-    "browser/aw_autofill_client.h",
-    "browser/aw_browser_context.cc",
-    "browser/aw_browser_context.h",
-    "browser/aw_browser_main_parts.cc",
-    "browser/aw_browser_main_parts.h",
-    "browser/aw_browser_permission_request_delegate.h",
-    "browser/aw_browser_policy_connector.cc",
-    "browser/aw_browser_policy_connector.h",
-    "browser/aw_browser_process.cc",
-    "browser/aw_browser_process.h",
-    "browser/aw_browser_terminator.cc",
-    "browser/aw_browser_terminator.h",
-    "browser/aw_content_browser_client.cc",
-    "browser/aw_content_browser_client.h",
-    "browser/aw_content_browser_overlay_manifest.cc",
-    "browser/aw_content_browser_overlay_manifest.h",
-    "browser/aw_content_renderer_overlay_manifest.cc",
-    "browser/aw_content_renderer_overlay_manifest.h",
-    "browser/aw_contents.cc",
-    "browser/aw_contents.h",
-    "browser/aw_contents_client_bridge.cc",
-    "browser/aw_contents_client_bridge.h",
-    "browser/aw_contents_io_thread_client.cc",
-    "browser/aw_contents_io_thread_client.h",
-    "browser/aw_contents_lifecycle_notifier.cc",
-    "browser/aw_contents_lifecycle_notifier.h",
-    "browser/aw_contents_statics.cc",
-    "browser/aw_cookie_access_policy.cc",
-    "browser/aw_cookie_access_policy.h",
-    "browser/aw_debug.cc",
-    "browser/aw_devtools_manager_delegate.cc",
-    "browser/aw_devtools_manager_delegate.h",
-    "browser/aw_devtools_server.cc",
-    "browser/aw_devtools_server.h",
-    "browser/aw_download_manager_delegate.cc",
-    "browser/aw_download_manager_delegate.h",
-    "browser/aw_feature_list.cc",
-    "browser/aw_feature_list.h",
-    "browser/aw_feature_list_creator.cc",
-    "browser/aw_feature_list_creator.h",
-    "browser/aw_form_database.cc",
-    "browser/aw_form_database_service.cc",
-    "browser/aw_form_database_service.h",
-    "browser/aw_http_auth_handler.cc",
-    "browser/aw_http_auth_handler.h",
-    "browser/aw_javascript_dialog_manager.cc",
-    "browser/aw_javascript_dialog_manager.h",
-    "browser/aw_media_url_interceptor.cc",
-    "browser/aw_media_url_interceptor.h",
-    "browser/aw_metrics_log_uploader.cc",
-    "browser/aw_metrics_log_uploader.h",
-    "browser/aw_metrics_service_client.cc",
-    "browser/aw_metrics_service_client.h",
-    "browser/aw_pdf_exporter.cc",
-    "browser/aw_pdf_exporter.h",
-    "browser/aw_permission_manager.cc",
-    "browser/aw_permission_manager.h",
-    "browser/aw_print_manager.cc",
-    "browser/aw_print_manager.h",
-    "browser/aw_proxy_controller.cc",
-    "browser/aw_quota_manager_bridge.cc",
-    "browser/aw_quota_manager_bridge.h",
-    "browser/aw_quota_permission_context.cc",
-    "browser/aw_quota_permission_context.h",
-    "browser/aw_render_process.cc",
-    "browser/aw_render_process.h",
-    "browser/aw_render_process_gone_delegate.h",
-    "browser/aw_renderer_priority.h",
-    "browser/aw_resource_context.cc",
-    "browser/aw_resource_context.h",
-    "browser/aw_settings.cc",
-    "browser/aw_settings.h",
-    "browser/aw_speech_recognition_manager_delegate.cc",
-    "browser/aw_speech_recognition_manager_delegate.h",
-    "browser/aw_ssl_host_state_delegate.cc",
-    "browser/aw_ssl_host_state_delegate.h",
-    "browser/aw_variations_seed_bridge.cc",
-    "browser/aw_variations_seed_bridge.h",
-    "browser/aw_variations_service_client.cc",
-    "browser/aw_variations_service_client.h",
-    "browser/aw_web_contents_delegate.cc",
-    "browser/aw_web_contents_delegate.h",
-    "browser/aw_web_contents_view_delegate.cc",
-    "browser/aw_web_contents_view_delegate.h",
-    "browser/aw_web_ui_controller_factory.cc",
-    "browser/aw_web_ui_controller_factory.h",
-    "browser/cookie_manager.cc",
-    "browser/cookie_manager.h",
-    "browser/find_helper.cc",
-    "browser/find_helper.h",
-    "browser/icon_helper.cc",
-    "browser/icon_helper.h",
-    "browser/input_stream.cc",
-    "browser/input_stream.h",
-    "browser/js_java_interaction/js_java_configurator_host.cc",
-    "browser/js_java_interaction/js_java_configurator_host.h",
-    "browser/js_java_interaction/js_reply_proxy.cc",
-    "browser/js_java_interaction/js_reply_proxy.h",
-    "browser/js_java_interaction/js_to_java_messaging.cc",
-    "browser/js_java_interaction/js_to_java_messaging.h",
-    "browser/memory_metrics_logger.cc",
-    "browser/memory_metrics_logger.h",
-    "browser/network_service/android_stream_reader_url_loader.cc",
-    "browser/network_service/android_stream_reader_url_loader.h",
-    "browser/network_service/aw_network_change_notifier.cc",
-    "browser/network_service/aw_network_change_notifier.h",
-    "browser/network_service/aw_network_change_notifier_factory.cc",
-    "browser/network_service/aw_network_change_notifier_factory.h",
-    "browser/network_service/aw_proxy_config_monitor.cc",
-    "browser/network_service/aw_proxy_config_monitor.h",
-    "browser/network_service/aw_proxying_restricted_cookie_manager.cc",
-    "browser/network_service/aw_proxying_restricted_cookie_manager.h",
-    "browser/network_service/aw_proxying_url_loader_factory.cc",
-    "browser/network_service/aw_proxying_url_loader_factory.h",
-    "browser/network_service/aw_url_loader_throttle.cc",
-    "browser/network_service/aw_url_loader_throttle.h",
-    "browser/network_service/aw_web_resource_intercept_response.cc",
-    "browser/network_service/aw_web_resource_intercept_response.h",
-    "browser/network_service/aw_web_resource_request.cc",
-    "browser/network_service/aw_web_resource_request.h",
-    "browser/network_service/aw_web_resource_response.cc",
-    "browser/network_service/aw_web_resource_response.h",
-    "browser/network_service/input_stream_reader.cc",
-    "browser/network_service/input_stream_reader.h",
-    "browser/network_service/net_helpers.cc",
-    "browser/network_service/net_helpers.h",
-    "browser/permission/aw_permission_request.cc",
-    "browser/permission/aw_permission_request.h",
-    "browser/permission/aw_permission_request_delegate.cc",
-    "browser/permission/aw_permission_request_delegate.h",
-    "browser/permission/media_access_permission_request.cc",
-    "browser/permission/media_access_permission_request.h",
-    "browser/permission/permission_request_handler.cc",
-    "browser/permission/permission_request_handler.h",
-    "browser/permission/permission_request_handler_client.cc",
-    "browser/permission/permission_request_handler_client.h",
-    "browser/permission/simple_permission_request.cc",
-    "browser/permission/simple_permission_request.h",
-    "browser/popup_touch_handle_drawable.cc",
-    "browser/popup_touch_handle_drawable.h",
-    "browser/renderer_host/auto_login_parser.cc",
-    "browser/renderer_host/auto_login_parser.h",
-    "browser/renderer_host/aw_render_view_host_ext.cc",
-    "browser/renderer_host/aw_render_view_host_ext.h",
-    "browser/safe_browsing/aw_safe_browsing_blocking_page.cc",
-    "browser/safe_browsing/aw_safe_browsing_blocking_page.h",
-    "browser/safe_browsing/aw_safe_browsing_ui_manager.cc",
-    "browser/safe_browsing/aw_safe_browsing_ui_manager.h",
-    "browser/safe_browsing/aw_safe_browsing_whitelist_manager.cc",
-    "browser/safe_browsing/aw_safe_browsing_whitelist_manager.h",
-    "browser/safe_browsing/aw_url_checker_delegate_impl.cc",
-    "browser/safe_browsing/aw_url_checker_delegate_impl.h",
-    "browser/scoped_add_feature_flags.cc",
-    "browser/scoped_add_feature_flags.h",
-    "browser/state_serializer.cc",
-    "browser/state_serializer.h",
-    "browser/tracing/aw_trace_event_args_whitelist.cc",
-    "browser/tracing/aw_trace_event_args_whitelist.h",
-    "browser/tracing/aw_tracing_controller.cc",
-    "browser/tracing/aw_tracing_controller.h",
-    "browser/tracing/aw_tracing_delegate.cc",
-    "browser/tracing/aw_tracing_delegate.h",
     "lib/aw_main_delegate.cc",
     "lib/aw_main_delegate.h",
     "lib/webview_jni_onload.cc",
     "lib/webview_jni_onload.h",
   ]
 
-  public_deps = [
-    "//base",
-  ]
-
   deps = [
     ":browser_jni_headers",
-    ":generate_aw_resources",
-    ":generate_aw_strings",
-    ":generate_components_strings",
-    "//android_webview/browser/gfx:gfx",
+    "//android_webview/browser",
+    "//android_webview/browser/gfx",
     "//android_webview/common",
-    "//android_webview/common:common_mojom",
     "//android_webview/gpu",
-    "//android_webview/public",
     "//android_webview/renderer",
-    "//base/third_party/dynamic_annotations:dynamic_annotations",
+
+    # Called via JNI
     "//components/about_ui",
-    "//components/autofill/android:provider",
-    "//components/autofill/content/browser",
-    "//components/autofill/content/common/mojom",
-    "//components/autofill/content/renderer",
-    "//components/cdm/browser",
-    "//components/cdm/renderer",
-    "//components/content_capture/android",
-    "//components/content_capture/browser",
-    "//components/content_capture/renderer",
-    "//components/crash/android:crashpad_main",
-    "//components/crash/content/app",
-    "//components/crash/content/browser",
-    "//components/crash/core/common",
-    "//components/download/public/common:public",
-    "//components/embedder_support/android:web_contents_delegate",
-    "//components/google/core/common",
+    "//components/autofill/core/common",
     "//components/gwp_asan/buildflags",
-    "//components/heap_profiling",
-    "//components/keyed_service/content",
-    "//components/metrics",
-    "//components/metrics:gpu",
-    "//components/metrics:metrics",
-    "//components/metrics:net",
-    "//components/metrics:ui",
-    "//components/minidump_uploader",
-    "//components/navigation_interception",
-    "//components/network_session_configurator/common",
-    "//components/policy:generated",
-    "//components/policy/content/",
-    "//components/policy/core/browser",
-    "//components/policy/core/common",
-    "//components/prefs",
-    "//components/printing/browser",
-    "//components/printing/common",
-    "//components/printing/renderer",
-    "//components/safe_browsing",
-    "//components/safe_browsing/android:safe_browsing_mobile",
-    "//components/safe_browsing/browser",
-    "//components/safe_browsing/common",
-    "//components/safe_browsing/renderer:throttles",
-    "//components/safe_browsing/triggers",
-    "//components/safe_browsing/web_ui",
-    "//components/services/heap_profiling",
+    "//components/safe_browsing/android:safe_browsing_api_handler",
     "//components/services/heap_profiling/public/cpp",
-    "//components/services/heap_profiling/public/mojom",
     "//components/spellcheck:buildflags",
-    "//components/spellcheck/common:interfaces",
-    "//components/url_matcher",
-    "//components/variations/service",
-    "//components/version_info:channel",
+    "//components/spellcheck/common",
+    "//components/version_info",
     "//components/version_info/android:channel_getter",
-    "//components/visitedlink/browser",
-    "//components/visitedlink/renderer",
-    "//components/viz/service",
-    "//content",
     "//content/public/app:both",
     "//content/public/browser",
-    "//content/public/common",
     "//content/public/common:content_descriptor_keys",
-    "//content/public/common:service_names",
-    "//crypto",
     "//gin",
-    "//media",
-    "//media/midi",
-    "//media/mojo:buildflags",
-    "//net",
-    "//net:extras",
-    "//printing",
-    "//services/preferences/tracked:tracked",
-    "//services/resource_coordinator/public/cpp/memory_instrumentation",
-    "//services/resource_coordinator/public/cpp/memory_instrumentation:browser",
-    "//services/service_manager/public/cpp",
-    "//storage/browser",
-    "//storage/common",
-    "//third_party/blink/public:blink",
-    "//third_party/blink/public/common",
-    "//third_party/crashpad/crashpad/client",
-    "//ui/base",
+    "//gpu/command_buffer/service",
+    "//gpu/ipc:gl_in_process_context",
     "//ui/events:gesture_detection",
-    "//ui/shell_dialogs",
-    "//url",
-    "//v8",
     "//weblayer:weblayer_lib",
   ]
 
-  if (enable_spellcheck) {
-    deps += [
-      "//components/spellcheck/browser",
-      "//components/spellcheck/renderer",
-    ]
-  }
-
   if (enable_gwp_asan) {
     deps += [ "//components/gwp_asan/client" ]
   }
-
-  configs += [
-    "//tools/v8_context_snapshot:use_v8_context_snapshot",
-    "//v8:external_startup_data",
-  ]
 }
 
 java_group("android_webview_java") {
@@ -912,7 +651,7 @@
   }
 
   srcjar_deps = [
-    ":browser_enums",
+    "//android_webview/browser:browser_enums",
     "//components/safe_browsing/db:sb_threat_values",
   ]
 
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 361870d..927da45 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
@@ -14,7 +14,7 @@
 import android.os.ParcelFileDescriptor;
 
 import org.chromium.base.FileUtils;
-import org.chromium.components.aboutui.CreditUtils;
+import org.chromium.components.aboutui.CreditUtilsJni;
 
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
@@ -50,7 +50,7 @@
     public void writeDataToPipe(
             ParcelFileDescriptor output, Uri uri, String mimeType, Bundle opts, String filename) {
         if (WebViewApkApplication.initializeNative()) {
-            CreditUtils.nativeWriteCreditsHtml(output.detachFd());
+            CreditUtilsJni.get().writeCreditsHtml(output.detachFd());
         } else {
             // Missing native library means we're the webview stub and licenses are stored as an
             // asset.
diff --git a/android_webview/browser/BUILD.gn b/android_webview/browser/BUILD.gn
new file mode 100644
index 0000000..2e45158
--- /dev/null
+++ b/android_webview/browser/BUILD.gn
@@ -0,0 +1,260 @@
+# 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/android/rules.gni")
+import("//components/spellcheck/spellcheck_build_features.gni")
+
+java_cpp_enum("browser_enums") {
+  sources = [
+    "aw_renderer_priority.h",
+    "aw_settings.h",
+    "permission/aw_permission_request.h",
+    "safe_browsing/aw_safe_browsing_blocking_page.h",
+    "safe_browsing/aw_url_checker_delegate_impl.h",
+  ]
+}
+
+source_set("browser") {
+  sources = [
+    "android_protocol_handler.cc",
+    "android_protocol_handler.h",
+    "aw_autofill_client.cc",
+    "aw_autofill_client.h",
+    "aw_browser_context.cc",
+    "aw_browser_context.h",
+    "aw_browser_main_parts.cc",
+    "aw_browser_main_parts.h",
+    "aw_browser_permission_request_delegate.h",
+    "aw_browser_policy_connector.cc",
+    "aw_browser_policy_connector.h",
+    "aw_browser_process.cc",
+    "aw_browser_process.h",
+    "aw_browser_terminator.cc",
+    "aw_browser_terminator.h",
+    "aw_content_browser_client.cc",
+    "aw_content_browser_client.h",
+    "aw_content_browser_overlay_manifest.cc",
+    "aw_content_browser_overlay_manifest.h",
+    "aw_content_renderer_overlay_manifest.cc",
+    "aw_content_renderer_overlay_manifest.h",
+    "aw_contents.cc",
+    "aw_contents.h",
+    "aw_contents_client_bridge.cc",
+    "aw_contents_client_bridge.h",
+    "aw_contents_io_thread_client.cc",
+    "aw_contents_io_thread_client.h",
+    "aw_contents_lifecycle_notifier.cc",
+    "aw_contents_lifecycle_notifier.h",
+    "aw_contents_statics.cc",
+    "aw_cookie_access_policy.cc",
+    "aw_cookie_access_policy.h",
+    "aw_debug.cc",
+    "aw_devtools_manager_delegate.cc",
+    "aw_devtools_manager_delegate.h",
+    "aw_devtools_server.cc",
+    "aw_devtools_server.h",
+    "aw_download_manager_delegate.cc",
+    "aw_download_manager_delegate.h",
+    "aw_feature_list.cc",
+    "aw_feature_list.h",
+    "aw_feature_list_creator.cc",
+    "aw_feature_list_creator.h",
+    "aw_form_database.cc",
+    "aw_form_database_service.cc",
+    "aw_form_database_service.h",
+    "aw_http_auth_handler.cc",
+    "aw_http_auth_handler.h",
+    "aw_javascript_dialog_manager.cc",
+    "aw_javascript_dialog_manager.h",
+    "aw_media_url_interceptor.cc",
+    "aw_media_url_interceptor.h",
+    "aw_metrics_log_uploader.cc",
+    "aw_metrics_log_uploader.h",
+    "aw_metrics_service_client.cc",
+    "aw_metrics_service_client.h",
+    "aw_pdf_exporter.cc",
+    "aw_pdf_exporter.h",
+    "aw_permission_manager.cc",
+    "aw_permission_manager.h",
+    "aw_print_manager.cc",
+    "aw_print_manager.h",
+    "aw_proxy_controller.cc",
+    "aw_quota_manager_bridge.cc",
+    "aw_quota_manager_bridge.h",
+    "aw_quota_permission_context.cc",
+    "aw_quota_permission_context.h",
+    "aw_render_process.cc",
+    "aw_render_process.h",
+    "aw_render_process_gone_delegate.h",
+    "aw_renderer_priority.h",
+    "aw_resource_context.cc",
+    "aw_resource_context.h",
+    "aw_settings.cc",
+    "aw_settings.h",
+    "aw_speech_recognition_manager_delegate.cc",
+    "aw_speech_recognition_manager_delegate.h",
+    "aw_ssl_host_state_delegate.cc",
+    "aw_ssl_host_state_delegate.h",
+    "aw_variations_seed_bridge.cc",
+    "aw_variations_seed_bridge.h",
+    "aw_variations_service_client.cc",
+    "aw_variations_service_client.h",
+    "aw_web_contents_delegate.cc",
+    "aw_web_contents_delegate.h",
+    "aw_web_contents_view_delegate.cc",
+    "aw_web_contents_view_delegate.h",
+    "aw_web_ui_controller_factory.cc",
+    "aw_web_ui_controller_factory.h",
+    "cookie_manager.cc",
+    "cookie_manager.h",
+    "find_helper.cc",
+    "find_helper.h",
+    "icon_helper.cc",
+    "icon_helper.h",
+    "input_stream.cc",
+    "input_stream.h",
+    "js_java_interaction/js_java_configurator_host.cc",
+    "js_java_interaction/js_java_configurator_host.h",
+    "js_java_interaction/js_reply_proxy.cc",
+    "js_java_interaction/js_reply_proxy.h",
+    "js_java_interaction/js_to_java_messaging.cc",
+    "js_java_interaction/js_to_java_messaging.h",
+    "memory_metrics_logger.cc",
+    "memory_metrics_logger.h",
+    "network_service/android_stream_reader_url_loader.cc",
+    "network_service/android_stream_reader_url_loader.h",
+    "network_service/aw_network_change_notifier.cc",
+    "network_service/aw_network_change_notifier.h",
+    "network_service/aw_network_change_notifier_factory.cc",
+    "network_service/aw_network_change_notifier_factory.h",
+    "network_service/aw_proxy_config_monitor.cc",
+    "network_service/aw_proxy_config_monitor.h",
+    "network_service/aw_proxying_restricted_cookie_manager.cc",
+    "network_service/aw_proxying_restricted_cookie_manager.h",
+    "network_service/aw_proxying_url_loader_factory.cc",
+    "network_service/aw_proxying_url_loader_factory.h",
+    "network_service/aw_url_loader_throttle.cc",
+    "network_service/aw_url_loader_throttle.h",
+    "network_service/aw_web_resource_intercept_response.cc",
+    "network_service/aw_web_resource_intercept_response.h",
+    "network_service/aw_web_resource_request.cc",
+    "network_service/aw_web_resource_request.h",
+    "network_service/aw_web_resource_response.cc",
+    "network_service/aw_web_resource_response.h",
+    "network_service/input_stream_reader.cc",
+    "network_service/input_stream_reader.h",
+    "network_service/net_helpers.cc",
+    "network_service/net_helpers.h",
+    "permission/aw_permission_request.cc",
+    "permission/aw_permission_request.h",
+    "permission/aw_permission_request_delegate.cc",
+    "permission/aw_permission_request_delegate.h",
+    "permission/media_access_permission_request.cc",
+    "permission/media_access_permission_request.h",
+    "permission/permission_request_handler.cc",
+    "permission/permission_request_handler.h",
+    "permission/permission_request_handler_client.cc",
+    "permission/permission_request_handler_client.h",
+    "permission/simple_permission_request.cc",
+    "permission/simple_permission_request.h",
+    "popup_touch_handle_drawable.cc",
+    "popup_touch_handle_drawable.h",
+    "renderer_host/auto_login_parser.cc",
+    "renderer_host/auto_login_parser.h",
+    "renderer_host/aw_render_view_host_ext.cc",
+    "renderer_host/aw_render_view_host_ext.h",
+    "safe_browsing/aw_safe_browsing_blocking_page.cc",
+    "safe_browsing/aw_safe_browsing_blocking_page.h",
+    "safe_browsing/aw_safe_browsing_ui_manager.cc",
+    "safe_browsing/aw_safe_browsing_ui_manager.h",
+    "safe_browsing/aw_safe_browsing_whitelist_manager.cc",
+    "safe_browsing/aw_safe_browsing_whitelist_manager.h",
+    "safe_browsing/aw_url_checker_delegate_impl.cc",
+    "safe_browsing/aw_url_checker_delegate_impl.h",
+    "scoped_add_feature_flags.cc",
+    "scoped_add_feature_flags.h",
+    "state_serializer.cc",
+    "state_serializer.h",
+    "tracing/aw_trace_event_args_whitelist.cc",
+    "tracing/aw_trace_event_args_whitelist.h",
+    "tracing/aw_tracing_controller.cc",
+    "tracing/aw_tracing_controller.h",
+    "tracing/aw_tracing_delegate.cc",
+    "tracing/aw_tracing_delegate.h",
+  ]
+
+  deps = [
+    "//android_webview:browser_jni_headers",
+    "//android_webview:generate_components_strings",
+    "//android_webview/browser/gfx",
+    "//android_webview/common",
+    "//android_webview/common:common_mojom",
+    "//components/autofill/android:provider",
+    "//components/autofill/content/browser",
+    "//components/cdm/browser",
+    "//components/content_capture/android",
+    "//components/content_capture/browser",
+    "//components/crash/content/app",
+    "//components/crash/content/browser",
+    "//components/embedder_support/android:web_contents_delegate",
+    "//components/google/core/common",
+    "//components/heap_profiling",
+    "//components/metrics",
+    "//components/metrics:gpu",
+    "//components/metrics:net",
+    "//components/metrics:ui",
+    "//components/minidump_uploader",
+    "//components/navigation_interception",
+    "//components/policy/content/",
+    "//components/policy/core/browser",
+    "//components/pref_registry",
+    "//components/prefs",
+    "//components/printing/browser",
+    "//components/printing/common",
+    "//components/safe_browsing",
+    "//components/safe_browsing:features",
+    "//components/safe_browsing:ping_manager",
+    "//components/safe_browsing/android:remote_database_manager",
+    "//components/safe_browsing/browser",
+    "//components/safe_browsing/browser:network_context",
+    "//components/safe_browsing/common",
+    "//components/safe_browsing/db:database_manager",
+    "//components/safe_browsing/db:safebrowsing_proto",
+    "//components/safe_browsing/triggers",
+    "//components/safe_browsing/web_ui",
+    "//components/safe_browsing/web_ui:constants",
+    "//components/security_interstitials/content:security_interstitial_page",
+    "//components/security_interstitials/core",
+    "//components/services/heap_profiling/public/cpp",
+    "//components/spellcheck:buildflags",
+    "//components/url_formatter",
+    "//components/user_prefs",
+    "//components/variations",
+    "//components/variations/net",
+    "//components/variations/service",
+    "//components/version_info",
+    "//components/version_info/android:channel_getter",
+    "//components/visitedlink/browser",
+    "//components/webdata/common",
+    "//content/public/browser",
+    "//media/mojo:buildflags",
+    "//printing",
+    "//services/preferences/tracked",
+    "//services/resource_coordinator/public/cpp/memory_instrumentation:browser",
+    "//third_party/crashpad/crashpad/client",
+    "//ui/android",
+    "//ui/gl",
+    "//ui/resources",
+    "//ui/touch_selection",
+  ]
+
+  if (enable_spellcheck) {
+    deps += [ "//components/spellcheck/browser" ]
+  }
+
+  configs += [
+    "//tools/v8_context_snapshot:use_v8_context_snapshot",
+    "//v8:external_startup_data",
+  ]
+}
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc
index 71f5986..7ca0612 100644
--- a/android_webview/browser/aw_content_browser_client.cc
+++ b/android_webview/browser/aw_content_browser_client.cc
@@ -38,7 +38,6 @@
 #include "android_webview/common/aw_switches.h"
 #include "android_webview/common/render_view_messages.h"
 #include "android_webview/common/url_constants.h"
-#include "android_webview/grit/aw_resources.h"
 #include "base/android/locale_utils.h"
 #include "base/base_paths_android.h"
 #include "base/base_switches.h"
diff --git a/android_webview/browser/cookie_manager.cc b/android_webview/browser/cookie_manager.cc
index 1d1c85aa..7176279 100644
--- a/android_webview/browser/cookie_manager.cc
+++ b/android_webview/browser/cookie_manager.cc
@@ -41,7 +41,6 @@
 #include "net/cookies/cookie_store.h"
 #include "net/cookies/cookie_util.h"
 #include "net/cookies/parsed_cookie.h"
-#include "net/extras/sqlite/cookie_crypto_delegate.h"
 #include "net/url_request/url_request_context.h"
 #include "services/network/network_service.h"
 #include "services/network/public/mojom/cookie_manager.mojom.h"
diff --git a/android_webview/browser/gfx/BUILD.gn b/android_webview/browser/gfx/BUILD.gn
index c08458d5..f6fb4ff4 100644
--- a/android_webview/browser/gfx/BUILD.gn
+++ b/android_webview/browser/gfx/BUILD.gn
@@ -64,6 +64,7 @@
     "//android_webview:browser_jni_headers",
     "//base",
     "//components/ui_devtools:buildflags",
+    "//components/viz/service",
     "//content/public/browser",
     "//gpu/command_buffer/client:gles2_implementation",
     "//gpu/command_buffer/service",
diff --git a/android_webview/docs/test-instructions.md b/android_webview/docs/test-instructions.md
index 70b1e12..9e29b47 100644
--- a/android_webview/docs/test-instructions.md
+++ b/android_webview/docs/test-instructions.md
@@ -144,6 +144,9 @@
     -f=android.webkit.cts.WebViewTest#* # Supports similar test filters
 ```
 
+To disable failing CTS tests, please see the cts_config
+[README](../tools/cts_config/README.md) file.
+
 If you'd like to edit these tests, see internal documentation at
 http://go/clank-webview for working with Android checkouts.
 
diff --git a/android_webview/java/src/org/chromium/android_webview/AwFeatureList.java b/android_webview/java/src/org/chromium/android_webview/AwFeatureList.java
index 60c81c9..77061c1 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwFeatureList.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwFeatureList.java
@@ -17,7 +17,7 @@
  */
 @JNINamespace("android_webview")
 @MainDex
-final public class AwFeatureList {
+public final class AwFeatureList {
     // Do not instantiate this class.
     private AwFeatureList() {}
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java
index 693fff2..145670c 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java
@@ -53,7 +53,7 @@
     private static final int CONTENT_SIZE_CHANGE_STABILITY_TIMEOUT_MS = 1000;
 
     private static class OnContentSizeChangedHelper extends CallbackHelper {
-        final private Object mLock = new Object();
+        private final Object mLock = new Object();
         @GuardedBy("mLock")
         private int mWidth;
         @GuardedBy("mLock")
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java
index 5398f39f..5202d24 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java
@@ -47,6 +47,7 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.task.PostTask;
 import org.chromium.base.test.util.CallbackHelper;
+import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.MetricsUtils;
 import org.chromium.base.test.util.MinAndroidSdkLevel;
@@ -1276,7 +1277,10 @@
     @Test
     @SmallTest
     @Feature({"AndroidWebView"})
-    public void testSelectControlChangeNotification() throws Throwable {
+    @DisableIf.Build(sdk_is_less_than = Build.VERSION_CODES.P,
+            message = "This test is disabled on Android O because of https://crbug.com/997362")
+    public void
+    testSelectControlChangeNotification() throws Throwable {
         int cnt = 0;
         TestWebServer webServer = TestWebServer.start();
         final String data = "<!DOCTYPE html>"
@@ -1316,7 +1320,10 @@
     @Test
     @SmallTest
     @Feature({"AndroidWebView"})
-    public void testSelectControlChangeStartAutofillSession() throws Throwable {
+    @DisableIf.Build(sdk_is_less_than = Build.VERSION_CODES.P,
+            message = "This test is disabled on Android O because of https://crbug.com/997362")
+    public void
+    testSelectControlChangeStartAutofillSession() throws Throwable {
         int cnt = 0;
         TestWebServer webServer = TestWebServer.start();
         final String data = "<!DOCTYPE html>"
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentCaptureTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentCaptureTest.java
index 9369d86..b1ceccf8 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentCaptureTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentCaptureTest.java
@@ -59,7 +59,9 @@
                 mWhiteList.toArray(whitelist);
                 isRegEx = new boolean[mWhiteList.size()];
                 int i = 0;
-                for (boolean r : mIsRegEx) isRegEx[i++] = r;
+                for (boolean r : mIsRegEx) {
+                    isRegEx[i++] = r;
+                }
             }
             setWhitelist(whitelist, isRegEx);
         }
@@ -69,12 +71,12 @@
     }
 
     private static class TestAwContentCaptureConsumer extends ContentCaptureConsumer {
-        private final static long DEFAULT_TIMEOUT_IN_SECONDS = 30;
+        private static final long DEFAULT_TIMEOUT_IN_SECONDS = 30;
 
-        public final static int CONTENT_CAPTURED = 1;
-        public final static int CONTENT_UPDATED = 2;
-        public final static int CONTENT_REMOVED = 3;
-        public final static int SESSION_REMOVED = 4;
+        public static final int CONTENT_CAPTURED = 1;
+        public static final int CONTENT_UPDATED = 2;
+        public static final int CONTENT_REMOVED = 3;
+        public static final int SESSION_REMOVED = 4;
 
         public TestAwContentCaptureConsumer(WebContents webContents) {
             super(webContents);
@@ -114,7 +116,9 @@
             mCurrentFrameSession = session;
             mRemovedIds = removedIds;
             // Remove the id from removedIds because id can be reused.
-            for (long id : removedIds) mCapturedContentIds.remove(id);
+            for (long id : removedIds) {
+                mCapturedContentIds.remove(id);
+            }
             mCallbacks.add(CONTENT_REMOVED);
             mCallbackHelper.notifyCalled();
         }
@@ -174,7 +178,9 @@
         public int[] getCallbacks() {
             int[] result = new int[mCallbacks.size()];
             int index = 0;
-            for (Integer c : mCallbacks) result[index++] = c;
+            for (Integer c : mCallbacks) {
+                result[index++] = c;
+            }
             return result;
         }
 
@@ -192,8 +198,8 @@
         private CallbackHelper mCallbackHelper = new CallbackHelper();
     }
 
-    private final static String MAIN_FRAME_FILE = "/main_frame.html";
-    private final static String SECOND_PAGE = "/second_page.html";
+    private static final String MAIN_FRAME_FILE = "/main_frame.html";
+    private static final String SECOND_PAGE = "/second_page.html";
 
     @Rule
     public AwActivityTestRule mRule = new AwActivityTestRule();
@@ -295,8 +301,9 @@
             throws Exception {
         if (expected == null && (result == null || result.isEmpty())) return;
         Assert.assertEquals(expected.size(), result.size());
-        for (int i = 0; i < expected.size(); i++)
+        for (int i = 0; i < expected.size(); i++) {
             verifyFrame(expected.get(i).getId(), expected.get(i).getValue(), result.get(i));
+        }
     }
 
     private static void verifyContent(Set<String> expectedContent, Set<Long> unexpectedIds,
@@ -340,7 +347,9 @@
     private static void verifyRemovedIds(Set<Long> expectedIds, long[] result) throws Exception {
         Assert.assertEquals(expectedIds.size(), result.length);
         Set<Long> resultSet = new HashSet<Long>(result.length);
-        for (long id : result) resultSet.add(id);
+        for (long id : result) {
+            resultSet.add(id);
+        }
         Assert.assertTrue(expectedIds.containsAll(resultSet));
     }
 
@@ -386,7 +395,9 @@
 
     private FrameSession createFrameSession(ContentCaptureData... frames) {
         FrameSession result = new FrameSession(frames.length);
-        for (ContentCaptureData f : frames) result.addAll(createFrameSession(f));
+        for (ContentCaptureData f : frames) {
+            result.addAll(createFrameSession(f));
+        }
         return result;
     }
 
@@ -397,13 +408,17 @@
 
     private static Set<String> toStringSet(String... strings) {
         Set<String> result = new HashSet<String>();
-        for (String s : strings) result.add(s);
+        for (String s : strings) {
+            result.add(s);
+        }
         return result;
     }
 
     private static Set<Long> toLongSet(Long... longs) {
         Set<Long> result = new HashSet<Long>();
-        for (Long s : longs) result.add(s);
+        for (Long s : longs) {
+            result.add(s);
+        }
         return result;
     }
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java
index 6902655..6dfcff22 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java
@@ -1084,7 +1084,7 @@
         verifyShouldOverrideUrlLoadingInPopup(popupPath, popupPath + "/");
     }
 
-    private final static String BAD_SCHEME = "badscheme://";
+    private static final String BAD_SCHEME = "badscheme://";
 
     // AwContentsClient handling an invalid network scheme
     private static class BadSchemeClient extends TestAwContentsClient {
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java
index 4a619ea..dda9599 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java
@@ -71,7 +71,7 @@
     private TestAwContentsClient mContentsClient;
     private AwContents mAwContents;
 
-    private final static String SECURE_COOKIE_HISTOGRAM_NAME = "Android.WebView.SecureCookieAction";
+    private static final String SECURE_COOKIE_HISTOGRAM_NAME = "Android.WebView.SecureCookieAction";
 
     @Before
     public void setUp() throws Exception {
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/ui/util/UploadedCrashesInfoLoaderTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/ui/util/UploadedCrashesInfoLoaderTest.java
index 36b7d47..860fd78 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/ui/util/UploadedCrashesInfoLoaderTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/ui/util/UploadedCrashesInfoLoaderTest.java
@@ -33,10 +33,10 @@
 @RunWith(AwJUnit4ClassRunner.class)
 @OnlyRunIn(SINGLE_PROCESS)
 public class UploadedCrashesInfoLoaderTest {
-    private final static String TEST_UPLOAD_TIME_STR = "1234567890";
-    private final static long TEST_UPLOAD_TIME = Long.parseLong(TEST_UPLOAD_TIME_STR);
-    private final static String TEST_UPLOAD_ID = "0123456789abcdef";
-    private final static String TEST_LOCAL_ID = "fedcba9876543210";
+    private static final String TEST_UPLOAD_TIME_STR = "1234567890";
+    private static final long TEST_UPLOAD_TIME = Long.parseLong(TEST_UPLOAD_TIME_STR);
+    private static final String TEST_UPLOAD_ID = "0123456789abcdef";
+    private static final String TEST_LOCAL_ID = "fedcba9876543210";
 
     private File mLogFile;
 
diff --git a/android_webview/tools/cts_archive/cipd.yaml b/android_webview/tools/cts_archive/cipd.yaml
index 00aa1b5b..7d83174 100644
--- a/android_webview/tools/cts_archive/cipd.yaml
+++ b/android_webview/tools/cts_archive/cipd.yaml
@@ -3,17 +3,19 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:$(cat version.txt)
+# cipd create --pkg-def cipd.yaml
 package: chromium/android_webview/tools/cts_archive
 description: Archive of WebView CTS tests
 data:
   - file: arm64/L/android-cts-arm64-5.1_r28.zip
   - file: arm64/M/android-cts-arm64-6.0_r32.zip
-  - file: arm64/N/android-cts-arm64-7.0_r31.zip
-  - file: arm64/O/android-cts-arm64-8.0_r19.zip
-  - file: arm64/P/android-cts-arm64-9.0_r8.zip
+  - file: arm64/N/android-cts-arm64-7.0_r32.zip
+  - file: arm64/O/android-cts-arm64-8.0_r20.zip
+  - file: arm64/P/android-cts-arm64-9.0_r9.zip
+  - file: arm64/Q/android-cts-arm64-10_r1.zip
   - file: x86/L/android-cts-x86-5.1_r28.zip
   - file: x86/M/android-cts-x86-6.0_r32.zip
-  - file: x86/N/android-cts-x86-7.0_r31.zip
-  - file: x86/O/android-cts-x86-8.0_r19.zip
-  - file: x86/P/android-cts-x86-9.0_r8.zip
+  - file: x86/N/android-cts-x86-7.0_r32.zip
+  - file: x86/O/android-cts-x86-8.0_r20.zip
+  - file: x86/P/android-cts-x86-9.0_r9.zip
+  - file: x86/Q/android-cts-x86-10_r1.zip
diff --git a/android_webview/tools/cts_archive/version.txt b/android_webview/tools/cts_archive/version.txt
deleted file mode 100644
index d3bdbdf..0000000
--- a/android_webview/tools/cts_archive/version.txt
+++ /dev/null
@@ -1 +0,0 @@
-1.7
diff --git a/android_webview/tools/cts_config/README.md b/android_webview/tools/cts_config/README.md
new file mode 100644
index 0000000..2adba58
--- /dev/null
+++ b/android_webview/tools/cts_config/README.md
@@ -0,0 +1,59 @@
+# Android WebView CTS Test Configuration
+
+Test apk(s) and tests to run on Android are configurable on a per
+Android release basis by editing the webview_cts_gcs_path.json file in this
+directory.
+
+## File format
+```json
+{
+  {
+    "<Android dessert letter>": {
+      "arch": {
+        "<arch1>": {
+          "filename": "<relative path to cts_archive_dir of cts zip>",
+          "_origin": "<CTS zip download url>",
+          "unzip_dir": "<relative path to work directory where cts should be unzipped to>"
+        },
+        "<arch2>": {
+          "filename": "<relative path to cts_archive_dir of cts zip>",
+          "_origin": "<CTS zip download url>",
+          "unzip_dir": "<relative path to work directory where cts should be unzipped to>"
+        }
+      },
+      "test_runs": [
+        {
+          "apk": "location of the test apk in the cts zip file",
+          "excludes": [
+            {
+              "match": "<class#testcase (wildcard supported) expression of test to skip>",
+              "_bug_id": "<bug reference comment, optional>"
+            }
+          ]
+        },
+        {
+          "apk": "location of the test apk in the cts zip file",
+          "includes": [
+            {
+              "match": "<class#testcase (wildcard supported) expression of test to run>"
+            }
+          ]
+        }
+      ]
+    }
+  },
+  ...
+}
+```
+
+*** note
+**Note:** Test names in the include/exclude list could change between releases,
+please adjust them accordingly.
+***
+
+## Skipping tests
+Add entries to the "exlcudes" list for the respective apk under "test_runs".
+
+*** note
+**Note:** If includes nor excludes are specified, all tests in the apk will run.
+***
diff --git a/android_webview/tools/cts_config/webview_cts_gcs_path.json b/android_webview/tools/cts_config/webview_cts_gcs_path.json
index e46fd0d..8740ddc 100644
--- a/android_webview/tools/cts_config/webview_cts_gcs_path.json
+++ b/android_webview/tools/cts_config/webview_cts_gcs_path.json
@@ -1,51 +1,14 @@
 {
-  "_usage": {
-    " The format of this file is as follows.  If includes nor excludes are specified, all tests in apk will run.": {
-      "<android SDK Code, such as L, M, N, ...>": {
-        "arch": {
-          "<arch1>": {
-            "filename": "<relative path to cts_archive_dir of cts zip>",
-            "_origin": "<branch@buildid>",
-            "unzip_dir": "<relative path to work directory where cts should be unzipped to>"
-          },
-          "<arch2>": {
-            "filename": "<relative path to cts_archive_dir of cts zip>",
-            "_origin": "<branch@buildid>",
-            "unzip_dir": "<relative path to work directory where cts should be unzipped to>"
-          }
-        },
-        "test_runs": [
-          {
-            "apk": "location of the test apk in the cts zip file",
-            "excludes": [
-              {
-                "match": "<class#testcase (wildcard supported) expression of test to skip>",
-                "_bug_id": "<bug reference comment, optional>"
-              }
-            ]
-          },
-          {
-            "apk": "location of the test apk in the cts zip file",
-            "includes": [
-              {
-                "match": "<class#testcase (wildcard supported) expression of test to run>"
-              }
-            ]
-          }
-        ]
-      }
-    }
-  },
   "L": {
     "arch": {
       "arm64": {
         "filename": "arm64/L/android-cts-arm64-5.1_r28.zip",
-        "_origin": "aosp-lollipop-mr1-cts-release@5.1_r28",
+        "_origin": "https://dl.google.com/dl/android/cts/android-cts-5.1_r28-linux_x86-arm.zip",
         "unzip_dir": "arm64/L/5.1_r28/"
       },
       "x86": {
         "filename": "x86/L/android-cts-x86-5.1_r28.zip",
-        "_origin": "aosp-lollipop-mr1-cts-release@5.1_r28",
+        "_origin": "https://dl.google.com/dl/android/cts/android-cts-5.1_r28-linux_x86-x86.zip",
         "unzip_dir": "x86/L/5.1_r28/"
       }
     },
@@ -125,12 +88,12 @@
     "arch": {
       "arm64": {
         "filename": "arm64/M/android-cts-arm64-6.0_r32.zip",
-        "_origin": "aosp-marshmallow-cts-release@6.0_r32",
+        "_origin": "https://dl.google.com/dl/android/cts/android-cts-6.0_r32-linux_x86-arm.zip",
         "unzip_dir": "arm64/M/6.0_r32/"
       },
       "x86": {
         "filename": "x86/M/android-cts-x86-6.0_r32.zip",
-        "_origin": "aosp-marshmallow-cts-release@6.0_r32",
+        "_origin": "https://dl.google.com/dl/android/cts/android-cts-6.0_r32-linux_x86-x86.zip",
         "unzip_dir": "x86/M/6.0_r32/"
       }
     },
@@ -209,25 +172,19 @@
   "N": {
     "arch": {
       "arm64": {
-        "filename": "arm64/N/android-cts-arm64-7.0_r31.zip",
-        "_origin": "aosp-nougat-cts-release@7.0_r31",
-        "unzip_dir": "arm64/N/7.0_r31/"
+        "filename": "arm64/N/android-cts-arm64-7.0_r32.zip",
+        "_origin": "https://dl.google.com/dl/android/cts/android-cts-7.0_r32-linux_x86-arm.zip",
+        "unzip_dir": "arm64/N/7.0_r32/"
       },
       "x86": {
-        "filename": "x86/N/android-cts-x86-7.0_r31.zip",
-        "_origin": "aosp-nougat-cts-release@7.0_r31",
-        "unzip_dir": "x86/N/7.0_r31/"
+        "filename": "x86/N/android-cts-x86-7.0_r32.zip",
+        "_origin": "https://dl.google.com/dl/android/cts/android-cts-7.0_r32-linux_x86-x86.zip",
+        "unzip_dir": "x86/N/7.0_r32/"
       }
     },
     "test_runs": [
       {
-        "apk": "android-cts/testcases/CtsWebkitTestCases.apk",
-        "excludes": [
-          {
-            "match": "android.webkit.cts.WebViewTest#testGetContentHeight",
-            "_bug_id": "crbug.com/967173"
-          }
-        ]
+        "apk": "android-cts/testcases/CtsWebkitTestCases.apk"
       },
       {
         "apk": "android-cts/testcases/CtsWidgetTestCases.apk",
@@ -242,25 +199,19 @@
   "O": {
     "arch": {
       "arm64": {
-        "filename": "arm64/O/android-cts-arm64-8.0_r19.zip",
-        "_origin": "aosp-oreo-cts-release@8.0_r19",
-        "unzip_dir": "arm64/O/8.0_r19/"
+        "filename": "arm64/O/android-cts-arm64-8.0_r20.zip",
+        "_origin": "https://dl.google.com/dl/android/cts/android-cts-8.0_r20-linux_x86-arm.zip",
+        "unzip_dir": "arm64/O/8.0_r20"
       },
       "x86": {
-        "filename": "x86/O/android-cts-x86-8.0_r19.zip",
-        "_origin": "aosp-oreo-cts-release@8.0_r19",
-        "unzip_dir": "x86/O/8.0_r19/"
+        "filename": "x86/O/android-cts-x86-8.0_r20.zip",
+        "_origin": "https://dl.google.com/dl/android/cts/android-cts-8.0_r20-linux_x86-x86.zip",
+        "unzip_dir": "x86/O/8.0_r20/"
       }
     },
     "test_runs": [
       {
-        "apk": "android-cts/testcases/CtsWebkitTestCases.apk",
-        "excludes": [
-          {
-            "match": "android.webkit.cts.WebViewTest#testGetContentHeight",
-            "_bug_id": "crbug.com/967173"
-          }
-        ]
+        "apk": "android-cts/testcases/CtsWebkitTestCases.apk"
       },
       {
         "apk": "android-cts/testcases/CtsWebViewStartupApp.apk"
@@ -270,14 +221,36 @@
   "P": {
     "arch": {
       "arm64": {
-	"filename": "arm64/P/android-cts-arm64-9.0_r8.zip",
-        "_origin": "aosp-pie-cts-release@9.0_r8",
-        "unzip_dir": "arm64/P/9.0_r8/"
+        "filename": "arm64/P/android-cts-arm64-9.0_r9.zip",
+        "_origin": "https://dl.google.com/dl/android/cts/android-cts-9.0_r9-linux_x86-arm.zip",
+        "unzip_dir": "arm64/P/9.0_r9/"
       },
       "x86": {
-	"filename": "x86/P/android-cts-x86-9.0_r8.zip",
-        "_origin": "aosp-pie-cts-release@9.0_r8",
-        "unzip_dir": "x86/P/9.0_r8/"
+        "filename": "x86/P/android-cts-x86-9.0_r9.zip",
+        "_origin": "https://dl.google.com/dl/android/cts/android-cts-9.0_r9-linux_x86-x86.zip",
+        "unzip_dir": "x86/P/9.0_r9/"
+      }
+    },
+    "test_runs": [
+      {
+        "apk": "android-cts/testcases/CtsWebkitTestCases.apk"
+      },
+      {
+        "apk": "android-cts/testcases/CtsWebViewStartupApp.apk"
+      }
+    ]
+  },
+  "Q": {
+    "arch": {
+      "arm64": {
+        "filename": "arm64/Q/android-cts-arm64-10_r1.zip",
+        "_origin": "https://dl.google.com/dl/android/cts/android-cts-10_r1-linux_x86-arm.zip",
+        "unzip_dir": "arm64/Q/10_r1/"
+      },
+      "x86": {
+        "filename": "x86/Q/android-cts-x86-10_r1.zip",
+        "_origin": "https://dl.google.com/dl/android/cts/android-cts-10_r1-linux_x86-x86.zip",
+        "unzip_dir": "x86/Q/10_r1/"
       }
     },
     "test_runs": [
@@ -285,8 +258,24 @@
         "apk": "android-cts/testcases/CtsWebkitTestCases.apk",
         "excludes": [
           {
-            "match": "android.webkit.cts.WebViewTest#testGetContentHeight",
-            "_bug_id": "crbug.com/967173"
+            "match": "android.webkit.cts.WebViewClientTest#testOnSafeBrowsingBillingCode",
+            "_bug_id": "crbug.com/1006953"
+          },
+          {
+            "match": "android.webkit.cts.WebViewClientTest#testOnSafeBrowsingHitBackToSafety",
+            "_bug_id": "crbug.com/1006953"
+          },
+          {
+            "match": "android.webkit.cts.WebViewClientTest#testOnSafeBrowsingMalwareCode",
+            "_bug_id": "crbug.com/1006953"
+          },
+          {
+            "match": "android.webkit.cts.WebViewClientTest#testOnSafeBrowsingPhishingCode",
+            "_bug_id": "crbug.com/1006953"
+          },
+          {
+            "match": "android.webkit.cts.WebViewClientTest#testOnSafeBrowsingUnwantedSoftwareCode",
+            "_bug_id": "crbug.com/1006953"
           }
         ]
       },
@@ -295,5 +284,4 @@
       }
     ]
   }
-
 }
diff --git a/android_webview/tools/record_netlog.py b/android_webview/tools/record_netlog.py
index 8308120d..17e4d21 100755
--- a/android_webview/tools/record_netlog.py
+++ b/android_webview/tools/record_netlog.py
@@ -40,8 +40,8 @@
 
 
 def CheckAppNotRunning(device, package_name, force):
-  processes = device.ListProcesses(package_name)
-  if processes:
+  is_running = bool(device.GetApplicationPids(package_name))
+  if is_running:
     msg = ('Netlog requires setting commandline flags, which only works if the '
            'application ({}) is not already running. Please kill the app and '
            'restart the script.'.format(
diff --git a/android_webview/tools/run_cts.py b/android_webview/tools/run_cts.py
index ef84ebb..4148b867 100755
--- a/android_webview/tools/run_cts.py
+++ b/android_webview/tools/run_cts.py
@@ -54,6 +54,7 @@
     version_codes.OREO: 'O',
     version_codes.OREO_MR1: 'O',
     version_codes.PIE: 'P',
+    version_codes.Q: 'Q',
 }
 
 # The test apks are apparently compatible across all architectures, the
diff --git a/ash/display/display_manager_unittest.cc b/ash/display/display_manager_unittest.cc
index f4e662b..9d5abfc 100644
--- a/ash/display/display_manager_unittest.cc
+++ b/ash/display/display_manager_unittest.cc
@@ -2068,6 +2068,71 @@
   EXPECT_EQ("1200x600", active_mode.size().ToString());
 }
 
+TEST_F(DisplayManagerTest, RotateExternalDisplayWithNonNativeMode) {
+  const int64_t internal_display_id = 5;
+  const int64_t external_id = 11;
+  const display::ManagedDisplayInfo internal_display_info =
+      display::ManagedDisplayInfo::CreateFromSpecWithID(
+          "1920x1080#1280x720|640x480%60", internal_display_id);
+  // Create an external display with a different origin to avoid triggering HW
+  // mirroring.
+  display::ManagedDisplayInfo external_display_info =
+      display::ManagedDisplayInfo::CreateFromSpecWithID(
+          "1+1-1280x720#1280x720|640x480%60", external_id);
+
+  std::vector<display::ManagedDisplayInfo> display_info_list;
+
+  display_info_list.push_back(internal_display_info);
+  display_info_list.push_back(external_display_info);
+  display_manager()->OnNativeDisplaysChanged(display_info_list);
+
+  display::test::DisplayManagerTestApi(display_manager())
+      .SetFirstDisplayAsInternalDisplay();
+
+  EXPECT_EQ(2U, display_manager()->num_connected_displays());
+  EXPECT_EQ(internal_display_id,
+            display::Screen::GetScreen()->GetPrimaryDisplay().id());
+
+  display::ManagedDisplayMode active_mode;
+  EXPECT_TRUE(
+      display_manager()->GetActiveModeForDisplayId(external_id, &active_mode));
+  EXPECT_TRUE(active_mode.native());
+
+  const auto& modes = external_display_info.display_modes();
+  EXPECT_TRUE(display::test::SetDisplayResolution(
+      display_manager(), external_id, modes[0].size()));
+  display_manager()->UpdateDisplays();
+
+  EXPECT_TRUE(
+      display_manager()->GetActiveModeForDisplayId(external_id, &active_mode));
+  EXPECT_FALSE(active_mode.native());
+
+  // Rotate the display.
+  display_manager()->SetDisplayRotation(
+      external_id, display::Display::ROTATE_90,
+      display::Display::RotationSource::ACTIVE);
+
+  // Refresh |external_display_info| since we have rotated the display.
+  external_display_info = display_manager()->GetDisplayInfo(external_id);
+
+  // Disconnect the external display.
+  display_info_list.clear();
+  display_info_list.push_back(internal_display_info);
+  display_manager()->OnNativeDisplaysChanged(display_info_list);
+
+  EXPECT_EQ(1U, display_manager()->num_connected_displays());
+
+  // Reconnect the external display.
+  display_info_list.push_back(external_display_info);
+  display_manager()->OnNativeDisplaysChanged(display_info_list);
+
+  EXPECT_EQ(2U, display_manager()->num_connected_displays());
+
+  // Verify the display maintains the rotation.
+  auto external_info = display_manager()->GetDisplayInfo(external_id);
+  EXPECT_EQ(display::Display::ROTATE_90, external_info.GetActiveRotation());
+}
+
 TEST_F(DisplayManagerTest, UpdateMouseCursorAfterRotateZoom) {
   // Make sure just rotating will not change native location.
   UpdateDisplay("300x200,200x150");
diff --git a/ash/public/cpp/system_tray.h b/ash/public/cpp/system_tray.h
index 2bc25e5..c93474f 100644
--- a/ash/public/cpp/system_tray.h
+++ b/ash/public/cpp/system_tray.h
@@ -96,6 +96,11 @@
   // Shows the volume slider bubble shown at the right bottom of screen.
   virtual void ShowVolumeSliderBubble() = 0;
 
+  // Shows the network detailed view bubble at the right bottom of the primary
+  // display. Set |show_by_click| to true if bubble is shown by mouse or gesture
+  // click (it is used e.g. for timing histograms).
+  virtual void ShowNetworkDetailedViewBubble(bool show_by_click) = 0;
+
  protected:
   SystemTray();
   virtual ~SystemTray();
diff --git a/ash/system/model/system_tray_model.cc b/ash/system/model/system_tray_model.cc
index ed9fc3f..299808f 100644
--- a/ash/system/model/system_tray_model.cc
+++ b/ash/system/model/system_tray_model.cc
@@ -107,4 +107,13 @@
   }
 }
 
+void SystemTrayModel::ShowNetworkDetailedViewBubble(bool show_by_click) {
+  // Show the bubble on the primary display.
+  UnifiedSystemTray* system_tray = Shell::GetPrimaryRootWindowController()
+                                       ->GetStatusAreaWidget()
+                                       ->unified_system_tray();
+  if (system_tray)
+    system_tray->ShowNetworkDetailedViewBubble(show_by_click);
+}
+
 }  // namespace ash
diff --git a/ash/system/model/system_tray_model.h b/ash/system/model/system_tray_model.h
index 3f8fda0be..2b9724f 100644
--- a/ash/system/model/system_tray_model.h
+++ b/ash/system/model/system_tray_model.h
@@ -49,6 +49,7 @@
       const base::string16& notification_body) override;
   void SetUpdateOverCellularAvailableIconVisible(bool visible) override;
   void ShowVolumeSliderBubble() override;
+  void ShowNetworkDetailedViewBubble(bool show_by_click) override;
 
   ClockModel* clock() { return clock_.get(); }
   EnterpriseDomainModel* enterprise_domain() {
diff --git a/ash/system/unified/unified_system_tray.cc b/ash/system/unified/unified_system_tray.cc
index 7061232..9c70fd7 100644
--- a/ash/system/unified/unified_system_tray.cc
+++ b/ash/system/unified/unified_system_tray.cc
@@ -208,6 +208,11 @@
   bubble_->ShowAudioDetailedView();
 }
 
+void UnifiedSystemTray::ShowNetworkDetailedViewBubble(bool show_by_click) {
+  ShowBubble(show_by_click);
+  bubble_->ShowNetworkDetailedView(true /* force */);
+}
+
 void UnifiedSystemTray::SetTrayBubbleHeight(int height) {
   ui_delegate_->SetTrayBubbleHeight(height);
 }
diff --git a/ash/system/unified/unified_system_tray.h b/ash/system/unified/unified_system_tray.h
index eb1ba069..361d1cb3 100644
--- a/ash/system/unified/unified_system_tray.h
+++ b/ash/system/unified/unified_system_tray.h
@@ -78,6 +78,9 @@
   // Shows main bubble with audio settings detailed view.
   void ShowAudioDetailedViewBubble();
 
+  // Shows main bubble with network settings detailed view.
+  void ShowNetworkDetailedViewBubble(bool show_by_click);
+
   // Return the bounds of the bubble in the screen.
   gfx::Rect GetBubbleBoundsInScreen() const;
 
diff --git a/ash/system/unified/unified_system_tray_bubble.cc b/ash/system/unified/unified_system_tray_bubble.cc
index 6c236df..e349ab5 100644
--- a/ash/system/unified/unified_system_tray_bubble.cc
+++ b/ash/system/unified/unified_system_tray_bubble.cc
@@ -183,6 +183,15 @@
   controller_->ShowAudioDetailedView();
 }
 
+void UnifiedSystemTrayBubble::ShowNetworkDetailedView(bool force) {
+  if (!bubble_widget_)
+    return;
+
+  DCHECK(unified_view_);
+  DCHECK(controller_);
+  controller_->ShowNetworkDetailedView(force);
+}
+
 void UnifiedSystemTrayBubble::UpdateBubble() {
   if (!bubble_widget_)
     return;
diff --git a/ash/system/unified/unified_system_tray_bubble.h b/ash/system/unified/unified_system_tray_bubble.h
index 14806d2..66a13c83 100644
--- a/ash/system/unified/unified_system_tray_bubble.h
+++ b/ash/system/unified/unified_system_tray_bubble.h
@@ -67,6 +67,9 @@
   // Show audio settings detailed view.
   void ShowAudioDetailedView();
 
+  // Show network settings detailed view.
+  void ShowNetworkDetailedView(bool force);
+
   // Update bubble bounds and focus if necessary.
   void UpdateBubble();
 
diff --git a/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java b/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
index 9d75b06..bc440cd 100644
--- a/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
+++ b/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
@@ -8,6 +8,7 @@
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.ActivityOptions;
+import android.app.Application;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
@@ -28,7 +29,6 @@
 import android.os.Bundle;
 import android.os.PowerManager;
 import android.os.Process;
-import android.os.StatFs;
 import android.os.StrictMode;
 import android.os.UserManager;
 import android.provider.Settings;
@@ -51,7 +51,11 @@
 import androidx.annotation.Nullable;
 
 import org.chromium.base.annotations.VerifiesOnLollipop;
+import org.chromium.base.annotations.VerifiesOnLollipopMR1;
+import org.chromium.base.annotations.VerifiesOnM;
 import org.chromium.base.annotations.VerifiesOnN;
+import org.chromium.base.annotations.VerifiesOnO;
+import org.chromium.base.annotations.VerifiesOnP;
 
 import java.io.UnsupportedEncodingException;
 
@@ -61,12 +65,172 @@
  * Do not inline because we use many new APIs, and if they are inlined, they could cause dex
  * validation errors on low Android versions.
  */
-@VerifiesOnLollipop
-@TargetApi(Build.VERSION_CODES.LOLLIPOP)
 public class ApiCompatibilityUtils {
     private ApiCompatibilityUtils() {
     }
 
+    @VerifiesOnP
+    @TargetApi(Build.VERSION_CODES.P)
+    private static class ApisP {
+        static String getProcessName() {
+            return Application.getProcessName();
+        }
+    }
+
+    @VerifiesOnO
+    @TargetApi(Build.VERSION_CODES.O)
+    private static class ApisO {
+        static void initNotificationSettingsIntent(Intent intent, String packageName) {
+            intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS);
+            intent.putExtra(Settings.EXTRA_APP_PACKAGE, packageName);
+        }
+
+        static void disableSmartSelectionTextClassifier(TextView textView) {
+            textView.setTextClassifier(TextClassifier.NO_OP);
+        }
+
+        static Bundle createLaunchDisplayIdActivityOptions(int displayId) {
+            ActivityOptions options = ActivityOptions.makeBasic();
+            options.setLaunchDisplayId(displayId);
+            return options.toBundle();
+        }
+    }
+
+    @VerifiesOnN
+    @TargetApi(Build.VERSION_CODES.N)
+    private static class ApisN {
+        static String toHtml(Spanned spanned, int option) {
+            return Html.toHtml(spanned, option);
+        }
+
+        // This class is sufficiently small that it's fine if it doesn't verify for N devices.
+        @TargetApi(Build.VERSION_CODES.N_MR1)
+        static boolean isDemoUser() {
+            UserManager userManager =
+                    (UserManager) ContextUtils.getApplicationContext().getSystemService(
+                            Context.USER_SERVICE);
+            return userManager.isDemoUser();
+        }
+
+        static String getLocale(InputMethodSubtype inputMethodSubType) {
+            return inputMethodSubType.getLanguageTag();
+        }
+
+        static boolean isInMultiWindowMode(Activity activity) {
+            return activity.isInMultiWindowMode();
+        }
+    }
+
+    @VerifiesOnM
+    @TargetApi(Build.VERSION_CODES.M)
+    private static class ApisM {
+        public static void setStatusBarIconColor(View rootView, boolean useDarkIcons) {
+            int systemUiVisibility = rootView.getSystemUiVisibility();
+            if (useDarkIcons) {
+                systemUiVisibility |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
+            } else {
+                systemUiVisibility &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
+            }
+            rootView.setSystemUiVisibility(systemUiVisibility);
+        }
+    }
+
+    @VerifiesOnLollipopMR1
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
+    private static class ApisLmr1 {
+        static void setAccessibilityTraversalBefore(View view, int viewFocusedAfter) {
+            view.setAccessibilityTraversalBefore(viewFocusedAfter);
+        }
+    }
+
+    @VerifiesOnLollipop
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+    private static class ApisL {
+        static final int FLAG_ACTIVITY_NEW_DOCUMENT = Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
+
+        static void finishAndRemoveTask(Activity activity) {
+            activity.finishAndRemoveTask();
+        }
+
+        static void finishAfterTransition(Activity activity) {
+            activity.finishAfterTransition();
+        }
+
+        static void setElevation(PopupWindow popupWindow, float elevationValue) {
+            popupWindow.setElevation(elevationValue);
+        }
+
+        static boolean isInteractive(PowerManager manager) {
+            return manager.isInteractive();
+        }
+
+        static boolean shouldSkipFirstUseHints(ContentResolver contentResolver) {
+            return Settings.Secure.getInt(contentResolver, Settings.Secure.SKIP_FIRST_USE_HINTS, 0)
+                    != 0;
+        }
+
+        static void setTaskDescription(Activity activity, String title, Bitmap icon, int color) {
+            ActivityManager.TaskDescription description =
+                    new ActivityManager.TaskDescription(title, icon, color);
+            activity.setTaskDescription(description);
+        }
+
+        static void setStatusBarColor(Window window, int statusBarColor) {
+            // If both system bars are black, we can remove these from our layout,
+            // removing or shrinking the SurfaceFlinger overlay required for our views.
+            // This benefits battery usage on L and M.  However, this no longer provides a battery
+            // benefit as of N and starts to cause flicker bugs on O, so don't bother on O and up.
+            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O && statusBarColor == Color.BLACK
+                    && window.getNavigationBarColor() == Color.BLACK) {
+                window.clearFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+            } else {
+                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+            }
+            window.setStatusBarColor(statusBarColor);
+        }
+
+        static Drawable getDrawableForDensity(Resources res, int id, int density) {
+            // On newer OS versions, this check is done within getDrawableForDensity().
+            if (density == 0) {
+                return res.getDrawable(id, null);
+            }
+            return res.getDrawableForDensity(id, density, null);
+        }
+
+        static void setImageTintList(ImageView view, @Nullable ColorStateList tintList) {
+            if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
+                // Work around broken workaround in ImageViewCompat, see
+                // https://crbug.com/891609#c3.
+                if (tintList != null && view.getImageTintMode() == null) {
+                    view.setImageTintMode(PorterDuff.Mode.SRC_IN);
+                }
+            }
+            ImageViewCompat.setImageTintList(view, tintList);
+
+            if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
+                // Work around that the tint list is not cleared when setting tint list to null on L
+                // in some cases. See https://crbug.com/983686.
+                if (tintList == null) view.refreshDrawableState();
+            }
+        }
+
+        static Drawable getUserBadgedIcon(PackageManager packageManager, Drawable drawable) {
+            return packageManager.getUserBadgedIcon(drawable, Process.myUserHandle());
+        }
+
+        static Drawable getUserBadgedDrawableForDensity(
+                Drawable drawable, Rect badgeLocation, int density) {
+            PackageManager packageManager =
+                    ContextUtils.getApplicationContext().getPackageManager();
+            return packageManager.getUserBadgedDrawableForDensity(
+                    drawable, Process.myUserHandle(), badgeLocation, density);
+        }
+
+        static ColorFilter getColorFilter(Drawable drawable) {
+            return drawable.getColorFilter();
+        }
+    }
+
     /**
      * Compares two long values numerically. The value returned is identical to what would be
      * returned by {@link Long#compare(long, long)} which is available since API level 19.
@@ -114,36 +278,20 @@
         try {
             return str.getBytes("UTF-8");
         } catch (UnsupportedEncodingException e) {
-            throw new IllegalStateException("UTF-8 encoding not available.", e);
+            throw new IllegalStateException(e);
         }
     }
 
     /**
-     * @return True if the running version of the Android supports printing.
-     */
-    public static boolean isPrintingSupported() {
-        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
-    }
-
-    /**
-     * @return True if the running version of the Android supports elevation. Elevation of a view
-     * determines the visual appearance of its shadow.
-     */
-    public static boolean isElevationSupported() {
-        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
-    }
-
-    /**
      * @see android.text.Html#toHtml(Spanned, int)
      * @param option is ignored on below N
      */
-    @VerifiesOnN
+    @SuppressWarnings("deprecation")
     public static String toHtml(Spanned spanned, int option) {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-            return Html.toHtml(spanned, option);
-        } else {
-            return Html.toHtml(spanned);
+            return ApisN.toHtml(spanned, option);
         }
+        return Html.toHtml(spanned);
     }
 
     // These methods have a new name, and the old name is deprecated.
@@ -153,7 +301,7 @@
      */
     public static void finishAndRemoveTask(Activity activity) {
         if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
-            activity.finishAndRemoveTask();
+            ApisL.finishAndRemoveTask(activity);
         } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
             // crbug.com/395772 : Fallback for Activity.finishAndRemoveTask() failing.
             new FinishAndRemoveTaskWithRetry(activity).run();
@@ -165,39 +313,26 @@
     /**
      * Set elevation if supported.
      */
-    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
-    public static boolean setElevation(View view, float elevationValue) {
-        if (!isElevationSupported()) return false;
-
-        view.setElevation(elevationValue);
-        return true;
-    }
-
-    /**
-     * Set elevation if supported.
-     */
-    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
-    public static boolean setElevation(PopupWindow window, float elevationValue) {
-        if (!isElevationSupported()) return false;
-
-        window.setElevation(elevationValue);
-        return true;
+    public static void setElevation(PopupWindow window, float elevationValue) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            ApisL.setElevation(window, elevationValue);
+        }
     }
 
     /**
      *  Gets an intent to start the Android system notification settings activity for an app.
      *
-     *  @param context Context of the app whose settings intent should be returned.
      */
-    public static Intent getNotificationSettingsIntent(Context context) {
+    public static Intent getNotificationSettingsIntent() {
         Intent intent = new Intent();
+        String packageName = ContextUtils.getApplicationContext().getPackageName();
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-            intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS);
-            intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName());
+            ApisO.initNotificationSettingsIntent(intent, packageName);
         } else {
             intent.setAction("android.settings.ACTION_APP_NOTIFICATION_SETTINGS");
-            intent.putExtra("app_package", context.getPackageName());
-            intent.putExtra("app_uid", context.getApplicationInfo().uid);
+            intent.putExtra("app_package", packageName);
+            intent.putExtra(
+                    "app_uid", ContextUtils.getApplicationContext().getApplicationInfo().uid);
         }
         return intent;
     }
@@ -214,7 +349,7 @@
 
         @Override
         public void run() {
-            mActivity.finishAndRemoveTask();
+            ApisL.finishAndRemoveTask(mActivity);
             mTryCount++;
             if (!mActivity.isFinishing()) {
                 if (mTryCount < MAX_TRY_COUNT) {
@@ -230,22 +365,21 @@
      * @return Whether the screen of the device is interactive.
      */
     @SuppressWarnings("deprecation")
-    public static boolean isInteractive(Context context) {
-        PowerManager manager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
-            return manager.isInteractive();
-        } else {
-            return manager.isScreenOn();
+    public static boolean isInteractive() {
+        PowerManager manager = (PowerManager) ContextUtils.getApplicationContext().getSystemService(
+                Context.POWER_SERVICE);
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            return ApisL.isInteractive(manager);
         }
+        return manager.isScreenOn();
     }
 
     @SuppressWarnings("deprecation")
     public static int getActivityNewDocumentFlag() {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-            return Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
-        } else {
-            return Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
+            return ApisL.FLAG_ACTIVITY_NEW_DOCUMENT;
         }
+        return Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET;
     }
 
     /**
@@ -253,11 +387,9 @@
      */
     public static boolean shouldSkipFirstUseHints(ContentResolver contentResolver) {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-            return Settings.Secure.getInt(
-                    contentResolver, Settings.Secure.SKIP_FIRST_USE_HINTS, 0) != 0;
-        } else {
-            return false;
+            return ApisL.shouldSkipFirstUseHints(contentResolver);
         }
+        return false;
     }
 
     /**
@@ -271,9 +403,7 @@
         assert Color.alpha(color) == 255;
 
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-            ActivityManager.TaskDescription description =
-                    new ActivityManager.TaskDescription(title, icon, color);
-            activity.setTaskDescription(description);
+            ApisL.setTaskDescription(activity, title, icon, color);
         }
     }
 
@@ -281,19 +411,9 @@
      * @see android.view.Window#setStatusBarColor(int color).
      */
     public static void setStatusBarColor(Window window, int statusBarColor) {
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
-
-        // If both system bars are black, we can remove these from our layout,
-        // removing or shrinking the SurfaceFlinger overlay required for our views.
-        // This benefits battery usage on L and M.  However, this no longer provides a battery
-        // benefit as of N and starts to cause flicker bugs on O, so don't bother on O and up.
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O && statusBarColor == Color.BLACK
-                && window.getNavigationBarColor() == Color.BLACK) {
-            window.clearFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
-        } else {
-            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            ApisL.setStatusBarColor(window, statusBarColor);
         }
-        window.setStatusBarColor(statusBarColor);
     }
 
     /**
@@ -304,15 +424,9 @@
      * @param useDarkIcons Whether the status bar icons should be dark.
      */
     public static void setStatusBarIconColor(View rootView, boolean useDarkIcons) {
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return;
-
-        int systemUiVisibility = rootView.getSystemUiVisibility();
-        if (useDarkIcons) {
-            systemUiVisibility |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
-        } else {
-            systemUiVisibility &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            ApisM.setStatusBarIconColor(rootView, useDarkIcons);
         }
-        rootView.setSystemUiVisibility(systemUiVisibility);
     }
 
     /**
@@ -320,35 +434,12 @@
      * TODO(ltian): use {@link AppCompatResources} to parse drawable to prevent fail on
      * {@link VectorDrawable}. (http://crbug.com/792129)
      */
-    @SuppressWarnings("deprecation")
     public static Drawable getDrawable(Resources res, int id) throws NotFoundException {
-        StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
-        try {
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-                return res.getDrawable(id, null);
-            } else {
-                return res.getDrawable(id);
-            }
-        } finally {
-            StrictMode.setThreadPolicy(oldPolicy);
-        }
+        return getDrawableForDensity(res, id, 0);
     }
 
-    public static void setImageTintList(
-            @NonNull ImageView view, @Nullable ColorStateList tintList) {
-        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
-            // Work around broken workaround in ImageViewCompat, see https://crbug.com/891609#c3.
-            if (tintList != null && view.getImageTintMode() == null) {
-                view.setImageTintMode(PorterDuff.Mode.SRC_IN);
-            }
-        }
-        ImageViewCompat.setImageTintList(view, tintList);
-
-        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
-            // Work around that the tint list is not cleared when setting tint list to null on L in
-            // some cases. See https://crbug.com/983686.
-            if (tintList == null) view.refreshDrawableState();
-        }
+    public static void setImageTintList(ImageView view, @Nullable ColorStateList tintList) {
+        ApisL.setImageTintList(view, tintList);
     }
 
     /**
@@ -356,10 +447,17 @@
      */
     @SuppressWarnings("deprecation")
     public static Drawable getDrawableForDensity(Resources res, int id, int density) {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-            return res.getDrawableForDensity(id, density, null);
-        } else {
+        StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
+        try {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+                return ApisL.getDrawableForDensity(res, id, density);
+            } else if (density == 0) {
+                // On newer OS versions, this check is done within getDrawableForDensity().
+                return res.getDrawable(id);
+            }
             return res.getDrawableForDensity(id, density);
+        } finally {
+            StrictMode.setThreadPolicy(oldPolicy);
         }
     }
 
@@ -368,7 +466,7 @@
      */
     public static void finishAfterTransition(Activity activity) {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-            activity.finishAfterTransition();
+            ApisL.finishAfterTransition(activity);
         } else {
             activity.finish();
         }
@@ -381,7 +479,7 @@
         Drawable drawable = getDrawable(context.getResources(), id);
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             PackageManager packageManager = context.getPackageManager();
-            drawable = packageManager.getUserBadgedIcon(drawable, Process.myUserHandle());
+            drawable = ApisL.getUserBadgedIcon(packageManager, drawable);
         }
         return drawable;
     }
@@ -391,11 +489,9 @@
      * UserHandle user, Rect badgeLocation, int badgeDensity).
      */
     public static Drawable getUserBadgedDrawableForDensity(
-            Context context, Drawable drawable, Rect badgeLocation, int density) {
+            Drawable drawable, Rect badgeLocation, int density) {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-            PackageManager packageManager = context.getPackageManager();
-            return packageManager.getUserBadgedDrawableForDensity(
-                    drawable, Process.myUserHandle(), badgeLocation, density);
+            drawable = ApisL.getUserBadgedDrawableForDensity(drawable, badgeLocation, density);
         }
         return drawable;
     }
@@ -405,23 +501,17 @@
      */
     @SuppressWarnings("deprecation")
     public static int getColor(Resources res, int id) throws NotFoundException {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-            return res.getColor(id, null);
-        } else {
-            return res.getColor(id);
-        }
+        return res.getColor(id);
     }
 
     /**
      * @see android.graphics.drawable.Drawable#getColorFilter().
      */
-    @SuppressWarnings("NewApi")
     public static ColorFilter getColorFilter(Drawable drawable) {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-            return drawable.getColorFilter();
-        } else {
-            return null;
+            return ApisL.getColorFilter(drawable);
         }
+        return null;
     }
 
     /**
@@ -429,60 +519,17 @@
      */
     @SuppressWarnings("deprecation")
     public static void setTextAppearance(TextView view, int id) {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-            view.setTextAppearance(id);
-        } else {
-            view.setTextAppearance(view.getContext(), id);
-        }
+        // setTextAppearance(id) is the undeprecated version of this, but it just calls the
+        // deprecated one, so there is no benefit to using the non-deprecated one until we can
+        // drop support for it entirely (new one was added in M).
+        view.setTextAppearance(view.getContext(), id);
     }
 
     /**
-     * See {@link android.os.StatFs#getAvailableBlocksLong}.
-     */
-    @SuppressWarnings("deprecation")
-    public static long getAvailableBlocks(StatFs statFs) {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
-            return statFs.getAvailableBlocksLong();
-        } else {
-            return statFs.getAvailableBlocks();
-        }
-    }
-
-    /**
-     * See {@link android.os.StatFs#getBlockCount}.
-     */
-    @SuppressWarnings("deprecation")
-    public static long getBlockCount(StatFs statFs) {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
-            return statFs.getBlockCountLong();
-        } else {
-            return statFs.getBlockCount();
-        }
-    }
-
-    /**
-     * See {@link android.os.StatFs#getBlockSize}.
-     */
-    @SuppressWarnings("deprecation")
-    public static long getBlockSize(StatFs statFs) {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
-            return statFs.getBlockSizeLong();
-        } else {
-            return statFs.getBlockSize();
-        }
-    }
-
-    /**
-     * @param context The Android context, used to retrieve the UserManager system service.
      * @return Whether the device is running in demo mode.
      */
-    @SuppressWarnings("NewApi")
-    public static boolean isDemoUser(Context context) {
-        // UserManager#isDemoUser() is only available in Android NMR1+.
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) return false;
-
-        UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
-        return userManager.isDemoUser();
+    public static boolean isDemoUser() {
+        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1 && ApisN.isDemoUser();
     }
 
     /**
@@ -505,10 +552,9 @@
     @SuppressWarnings("deprecation")
     public static String getLocale(InputMethodSubtype inputMethodSubType) {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-            return inputMethodSubType.getLanguageTag();
-        } else {
-            return inputMethodSubType.getLocale();
+            return ApisN.getLocale(inputMethodSubType);
         }
+        return inputMethodSubType.getLocale();
     }
 
     /**
@@ -531,21 +577,20 @@
      * @return Whether or not {@code activity} is currently in Android N+ multi-window mode.
      */
     public static boolean isInMultiWindowMode(Activity activity) {
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
-            return false;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            return ApisN.isInMultiWindowMode(activity);
         }
-        return activity.isInMultiWindowMode();
+        return false;
     }
 
     /**
      * Disables the Smart Select {@link TextClassifier} for the given {@link TextView} instance.
      * @param textView The {@link TextView} that should have its classifier disabled.
      */
-    @TargetApi(Build.VERSION_CODES.O)
     public static void disableSmartSelectionTextClassifier(TextView textView) {
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return;
-
-        textView.setTextClassifier(TextClassifier.NO_OP);
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            ApisO.disableSmartSelectionTextClassifier(textView);
+        }
     }
 
     /**
@@ -554,11 +599,10 @@
      * @return The created bundle, or null if unsupported.
      */
     public static Bundle createLaunchDisplayIdActivityOptions(int displayId) {
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return null;
-
-        ActivityOptions options = ActivityOptions.makeBasic();
-        options.setLaunchDisplayId(displayId);
-        return options.toBundle();
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            return ApisO.createLaunchDisplayIdActivityOptions(displayId);
+        }
+        return null;
     }
 
     /**
@@ -566,7 +610,7 @@
      */
     public static void setAccessibilityTraversalBefore(View view, int viewFocusedAfter) {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
-            view.setAccessibilityTraversalBefore(viewFocusedAfter);
+            ApisLmr1.setAccessibilityTraversalBefore(view, viewFocusedAfter);
         }
     }
 
@@ -621,6 +665,21 @@
                 == (EditorInfo.TYPE_CLASS_NUMBER | EditorInfo.TYPE_NUMBER_VARIATION_PASSWORD);
     }
 
+    // Access this via ContextUtils.getProcessName().
+    static String getProcessName() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+            return ApisP.getProcessName();
+        }
+        try {
+            Class<?> activityThreadClazz = Class.forName("android.app.ActivityThread");
+            return (String) activityThreadClazz.getMethod("currentProcessName").invoke(null);
+        } catch (Exception e) {
+            // If fallback logic is ever needed, refer to:
+            // https://chromium-review.googlesource.com/c/chromium/src/+/905563/1
+            throw new RuntimeException(e);
+        }
+    }
+
     private static class LayerDrawableCompat extends LayerDrawable {
         private boolean mMutated;
 
diff --git a/base/android/java/src/org/chromium/base/ContextUtils.java b/base/android/java/src/org/chromium/base/ContextUtils.java
index e7007cc..890d998 100644
--- a/base/android/java/src/org/chromium/base/ContextUtils.java
+++ b/base/android/java/src/org/chromium/base/ContextUtils.java
@@ -10,7 +10,6 @@
 import android.content.ContextWrapper;
 import android.content.SharedPreferences;
 import android.content.res.AssetManager;
-import android.os.Build;
 import android.os.Process;
 import android.preference.PreferenceManager;
 
@@ -18,7 +17,6 @@
 
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.MainDex;
-import org.chromium.base.annotations.VerifiesOnP;
 
 /**
  * This class provides Android application context related utility methods.
@@ -138,19 +136,8 @@
     }
 
     /** @return The name of the current process. E.g. "org.chromium.chrome:privileged_process0". */
-    @VerifiesOnP
     public static String getProcessName() {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-            return Application.getProcessName();
-        }
-        try {
-            Class<?> activityThreadClazz = Class.forName("android.app.ActivityThread");
-            return (String) activityThreadClazz.getMethod("currentProcessName").invoke(null);
-        } catch (Exception e) {
-            // If fallback logic is ever needed, refer to:
-            // https://chromium-review.googlesource.com/c/chromium/src/+/905563/1
-            throw new RuntimeException(e);
-        }
+        return ApiCompatibilityUtils.getProcessName();
     }
 
     /**
diff --git a/base/files/file.cc b/base/files/file.cc
index e8934b1..da0b52ef 100644
--- a/base/files/file.cc
+++ b/base/files/file.cc
@@ -6,6 +6,7 @@
 #include "base/files/file_path.h"
 #include "base/files/file_tracing.h"
 #include "base/metrics/histogram.h"
+#include "base/numerics/safe_conversions.h"
 #include "base/timer/elapsed_timer.h"
 #include "build/build_config.h"
 
@@ -96,6 +97,29 @@
 }
 #endif
 
+bool File::ReadAndCheck(int64_t offset, span<uint8_t> data) {
+  int size = checked_cast<int>(data.size());
+  return Read(offset, reinterpret_cast<char*>(data.data()), size) == size;
+}
+
+bool File::ReadAtCurrentPosAndCheck(span<uint8_t> data) {
+  int size = checked_cast<int>(data.size());
+  return ReadAtCurrentPos(reinterpret_cast<char*>(data.data()), size) == size;
+}
+
+bool File::WriteAndCheck(int64_t offset, span<const uint8_t> data) {
+  int size = checked_cast<int>(data.size());
+  return Write(offset, reinterpret_cast<const char*>(data.data()), size) ==
+         size;
+}
+
+bool File::WriteAtCurrentPosAndCheck(span<const uint8_t> data) {
+  int size = checked_cast<int>(data.size());
+  return WriteAtCurrentPos(reinterpret_cast<const char*>(data.data()), size) ==
+         size;
+}
+
+// static
 std::string File::ErrorToString(Error error) {
   switch (error) {
     case FILE_OK:
diff --git a/base/files/file.h b/base/files/file.h
index cc157a4..d61c9f43 100644
--- a/base/files/file.h
+++ b/base/files/file.h
@@ -10,10 +10,10 @@
 #include <string>
 
 #include "base/base_export.h"
+#include "base/containers/span.h"
 #include "base/files/file_path.h"
 #include "base/files/file_tracing.h"
 #include "base/files/platform_file.h"
-#include "base/files/scoped_file.h"
 #include "base/macros.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -201,6 +201,14 @@
   // (relative to the start) or -1 in case of error.
   int64_t Seek(Whence whence, int64_t offset);
 
+  // Simplified versions of Read() and friends (see below) that check the int
+  // return value and just return a boolean. They return true if and only if
+  // the function read in / wrote out exactly |size| bytes of data.
+  bool ReadAndCheck(int64_t offset, span<uint8_t> data);
+  bool ReadAtCurrentPosAndCheck(span<uint8_t> data);
+  bool WriteAndCheck(int64_t offset, span<const uint8_t> data);
+  bool WriteAtCurrentPosAndCheck(span<const uint8_t> data);
+
   // Reads the given number of bytes (or until EOF is reached) starting with the
   // given offset. Returns the number of bytes read, or -1 on error. Note that
   // this function makes a best effort to read all data on all platforms, so it
diff --git a/base/trace_event/builtin_categories.h b/base/trace_event/builtin_categories.h
index 6717a2b..dcb32a5 100644
--- a/base/trace_event/builtin_categories.h
+++ b/base/trace_event/builtin_categories.h
@@ -52,6 +52,7 @@
   X("cma")                                                               \
   X("compositor")                                                        \
   X("content")                                                           \
+  X("content-capture")                                                   \
   X("devtools")                                                          \
   X("devtools.timeline")                                                 \
   X("devtools.timeline.async")                                           \
diff --git a/build/android/BUILD.gn b/build/android/BUILD.gn
index 3e1f77f..afbb74d 100644
--- a/build/android/BUILD.gn
+++ b/build/android/BUILD.gn
@@ -93,8 +93,10 @@
     data += [
       "//third_party/android_build_tools/bundletool/bundletool-all-0.10.3.jar",
     ]
-    data_deps +=
-        [ "//third_party/android_platform/development/scripts:stack_py" ]
+    data_deps += [
+      "//third_party/android_platform/development/scripts:stack_py",
+      "//tools/android/avd:avd_py",
+    ]
   }
   if (is_asan) {
     data_deps += [ "//tools/android/asan/third_party:asan_device_setup" ]
diff --git a/build/android/pylib/base/environment_factory.py b/build/android/pylib/base/environment_factory.py
index 4d37274..2b402ab 100644
--- a/build/android/pylib/base/environment_factory.py
+++ b/build/android/pylib/base/environment_factory.py
@@ -4,14 +4,24 @@
 
 from pylib import constants
 from pylib.local.device import local_device_environment
-from pylib.local.emulator import local_emulator_environment
 from pylib.local.machine import local_machine_environment
 
+try:
+  # local_emulator_environment depends on //tools.
+  # If a client pulls in the //build subtree but not the //tools
+  # one, fail at emulator environment creation time.
+  from pylib.local.emulator import local_emulator_environment
+except ImportError:
+  local_emulator_environment = None
+
+
 def CreateEnvironment(args, output_manager, error_func):
 
   if args.environment == 'local':
     if args.command not in constants.LOCAL_MACHINE_TESTS:
-      if args.avd_name:
+      if args.avd_config:
+        if not local_emulator_environment:
+          error_func('emulator environment requested but not available.')
         return local_emulator_environment.LocalEmulatorEnvironment(
             args, output_manager, error_func)
       return local_device_environment.LocalDeviceEnvironment(
diff --git a/build/android/pylib/local/emulator/local_emulator_environment.py b/build/android/pylib/local/emulator/local_emulator_environment.py
index cd81cf9c3..76dccaf 100644
--- a/build/android/pylib/local/emulator/local_emulator_environment.py
+++ b/build/android/pylib/local/emulator/local_emulator_environment.py
@@ -2,120 +2,36 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import contextlib
-import logging
 import os
-import socket
-import stat
 
-from py_utils import tempfile_ext
-
-from devil.android.sdk import adb_wrapper
-from devil.utils import cmd_helper
-from devil.utils import timeout_retry
-
-from pylib import constants
+from pylib.constants import host_paths
 from pylib.local.device import local_device_environment
 
+AVD_DIR_PATH = os.path.join(host_paths.DIR_SOURCE_ROOT, 'tools', 'android',
+                            'avd')
+with host_paths.SysPath(AVD_DIR_PATH):
+  import avd  # pylint: disable=import-error
+
 
 class LocalEmulatorEnvironment(local_device_environment.LocalDeviceEnvironment):
 
   def __init__(self, args, output_manager, error_func):
     super(LocalEmulatorEnvironment, self).__init__(args, output_manager,
                                                    error_func)
-    self._avd_name = args.avd_name
-    self._emulator_home = (args.emulator_home
-                           or os.path.expanduser(os.path.join('~', '.android')))
-
-    root_ini = os.path.join(self._emulator_home, 'avd',
-                            '%s.ini' % self._avd_name)
-    if not os.path.exists(root_ini):
-      error_func('Unable to find configuration for AVD %s at %s' %
-                 (self._avd_name, root_ini))
-
-    self._emulator_path = os.path.join(constants.ANDROID_SDK_ROOT, 'emulator',
-                                       'emulator')
-    if not os.path.exists(self._emulator_path):
-      error_func('%s does not exist.' % self._emulator_path)
-
-    self._emulator_proc = None
-    self._emulator_serial = None
+    self._avd_config = avd.AvdConfig(args.avd_config)
+    self._emulator_instance = None
 
   #override
   def SetUp(self):
-    # Emulator start-up looks for the adb daemon. Make sure it's running.
-    adb_wrapper.AdbWrapper.StartServer()
-
-    # Emulator start-up tries to check for the SDK root by looking for
-    # platforms/ and platform-tools/. Ensure they exist.
-    # See http://bit.ly/2YAkyFE for context.
-    required_dirs = [
-        os.path.join(constants.ANDROID_SDK_ROOT, 'platforms'),
-        os.path.join(constants.ANDROID_SDK_ROOT, 'platform-tools'),
-    ]
-    for d in required_dirs:
-      if not os.path.exists(d):
-        os.makedirs(d)
-
-    # The emulator requires that some files are writable.
-    for dirname, _, filenames in os.walk(self._emulator_home):
-      for f in filenames:
-        path = os.path.join(dirname, f)
-        if (os.lstat(path).st_mode &
-            (stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) == stat.S_IRUSR):
-          os.chmod(path, stat.S_IRUSR | stat.S_IWUSR)
-
-    self._emulator_proc, self._emulator_serial = self._StartInstance()
-
-    logging.info('Emulator serial: %s', self._emulator_serial)
-    self._device_serials = [self._emulator_serial]
+    self._avd_config.Install()
+    self._emulator_instance = self._avd_config.StartInstance()
+    self._device_serials = [self._emulator_instance.serial]
     super(LocalEmulatorEnvironment, self).SetUp()
 
-  def _StartInstance(self):
-    """Starts an AVD instance.
-
-    Returns:
-      A (Popen, str) 2-tuple that includes the process and serial.
-    """
-    # Start up the AVD.
-    with tempfile_ext.TemporaryFileName() as socket_path, (contextlib.closing(
-        socket.socket(socket.AF_UNIX))) as sock:
-      sock.bind(socket_path)
-      emulator_cmd = [
-          self._emulator_path,
-          '-avd',
-          self._avd_name,
-          '-report-console',
-          'unix:%s' % socket_path,
-          '-read-only',
-          '-no-window',
-      ]
-      emulator_env = {}
-      if self._emulator_home:
-        emulator_env['ANDROID_EMULATOR_HOME'] = self._emulator_home
-      sock.listen(1)
-      emulator_proc = cmd_helper.Popen(emulator_cmd, env=emulator_env)
-
-      def listen_for_serial(s):
-        logging.info('Waiting for connection from emulator.')
-        with contextlib.closing(s.accept()[0]) as conn:
-          val = conn.recv(1024)
-          return 'emulator-%d' % int(val)
-
-      try:
-        emulator_serial = timeout_retry.Run(
-            listen_for_serial, timeout=30, retries=0, args=[sock])
-      except Exception:
-        emulator_proc.terminate()
-        raise
-
-      return (emulator_proc, emulator_serial)
-
   #override
   def TearDown(self):
     try:
       super(LocalEmulatorEnvironment, self).TearDown()
     finally:
-      if self._emulator_proc:
-        self._emulator_proc.terminate()
-        self._emulator_proc.wait()
+      if self._emulator_instance:
+        self._emulator_instance.Stop()
diff --git a/build/android/test_runner.py b/build/android/test_runner.py
index 932188e..5f6a362 100755
--- a/build/android/test_runner.py
+++ b/build/android/test_runner.py
@@ -310,13 +310,11 @@
   parser = parser.add_argument_group('emulator arguments')
 
   parser.add_argument(
-      '--avd-name',
-      help='Run and manage the lifetime of an AVD with the given name.')
-  parser.add_argument(
-      '--emulator-home',
+      '--avd-config',
       type=os.path.realpath,
-      help='Emulator home directory '
-      '(see ANDROID_EMULATOR_HOME: http://bit.ly/2K32oEy)')
+      help='Path to the avd config textpb. '
+      '(See //tools/android/avd/proto/ for message definition'
+      ' and existing textpb files.)')
 
 
 def AddGTestOptions(parser):
diff --git a/build/android/test_runner.pydeps b/build/android/test_runner.pydeps
index 4337f75..f19d9b9 100644
--- a/build/android/test_runner.pydeps
+++ b/build/android/test_runner.pydeps
@@ -118,6 +118,9 @@
 ../../third_party/markupsafe/__init__.py
 ../../third_party/markupsafe/_compat.py
 ../../third_party/markupsafe/_native.py
+../../tools/android/avd/avd.py
+../../tools/android/avd/proto/__init__.py
+../../tools/android/avd/proto/avd_pb2.py
 ../../tools/swarming_client/libs/__init__.py
 ../../tools/swarming_client/libs/logdog/__init__.py
 ../../tools/swarming_client/libs/logdog/bootstrap.py
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h
index f74d18f6..8b2e6256 100644
--- a/cc/trees/layer_tree_impl.h
+++ b/cc/trees/layer_tree_impl.h
@@ -194,7 +194,8 @@
   // Adapts an iterator of std::unique_ptr<LayerImpl> to an iterator of
   // LayerImpl*.
   template <typename Iterator>
-  class IteratorAdapter {
+  class IteratorAdapter
+      : public std::iterator<std::forward_iterator_tag, LayerImpl*> {
    public:
     explicit IteratorAdapter(Iterator it) : it_(it) {}
     bool operator==(IteratorAdapter o) const { return it_ == o.it_; }
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index c664d93..4abc02bbc 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -1506,7 +1506,9 @@
   "java/src/org/chromium/chrome/browser/ssl/CaptivePortalHelper.java",
   "java/src/org/chromium/chrome/browser/ssl/SecurityStateModel.java",
   "java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorCoordinator.java",
+  "java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorProperties.java",
   "java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorSceneLayer.java",
+  "java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorViewBinder.java",
   "java/src/org/chromium/chrome/browser/subresource_filter/TestSubresourceFilterPublisher.java",
   "java/src/org/chromium/chrome/browser/suggestions/DestructionObserver.java",
   "java/src/org/chromium/chrome/browser/suggestions/ImageFetcher.java",
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni
index 9c3e935..1c97020b7b 100644
--- a/chrome/android/chrome_test_java_sources.gni
+++ b/chrome/android/chrome_test_java_sources.gni
@@ -436,6 +436,8 @@
   "javatests/src/org/chromium/chrome/browser/snackbar/SnackbarTest.java",
   "javatests/src/org/chromium/chrome/browser/snackbar/undo/UndoBarControllerTest.java",
   "javatests/src/org/chromium/chrome/browser/ssl/CaptivePortalTest.java",
+  "javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorTest.java",
+  "javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorViewBinderTest.java",
   "javatests/src/org/chromium/chrome/browser/suggestions/ContentSuggestionsTest.java",
   "javatests/src/org/chromium/chrome/browser/suggestions/HomeSheetCardsUiCaptureTest.java",
   "javatests/src/org/chromium/chrome/browser/suggestions/HomeSheetNoTilesUiCaptureTest.java",
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator.java
index b2d2c24..092fbc5a3 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator.java
@@ -32,14 +32,28 @@
      */
     interface TabSelectionEditorController {
         /**
-         * Shows the TabSelectionEditor.
+         * Shows the TabSelectionEditor with the given {@link Tab}s.
+         * @param tabs List of {@link Tab}s to show.
          */
-        void show();
+        void show(List<Tab> tabs);
 
         /**
          * @return Whether or not the TabSelectionEditor consumed the event.
          */
         boolean handleBackPressed();
+
+        /**
+         * Configure the Toolbar for TabSelectionEditor. The default button text is "Group".
+         * @param actionButtonText Button text for the action button.
+         * @param actionButtonOnClickListener Click listener for the action button.
+         * @param actionButtonEnablingThreshold The minimum threshold to enable the action button.
+         *         If it's -1 use the default value.
+         * @param navigationButtonOnClickListener Click listener for the navigation button.
+         */
+        void configureToolbar(@Nullable String actionButtonText,
+                @Nullable View.OnClickListener actionButtonOnClickListener,
+                int actionButtonEnablingThreshold,
+                @Nullable View.OnClickListener navigationButtonOnClickListener);
     }
 
     private final Context mContext;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayoutBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayoutBinder.java
index 26fd19c..a728eed 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayoutBinder.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayoutBinder.java
@@ -25,9 +25,9 @@
             } else {
                 view.hide();
             }
-        } else if (TabSelectionEditorProperties.TOOLBAR_GROUP_BUTTON_LISTENER == propertyKey) {
+        } else if (TabSelectionEditorProperties.TOOLBAR_ACTION_BUTTON_LISTENER == propertyKey) {
             view.getToolbar().setActionButtonOnClickListener(
-                    model.get(TabSelectionEditorProperties.TOOLBAR_GROUP_BUTTON_LISTENER));
+                    model.get(TabSelectionEditorProperties.TOOLBAR_ACTION_BUTTON_LISTENER));
         } else if (TabSelectionEditorProperties.TOOLBAR_NAVIGATION_LISTENER == propertyKey) {
             view.getToolbar().setNavigationOnClickListener(
                     model.get(TabSelectionEditorProperties.TOOLBAR_NAVIGATION_LISTENER));
@@ -42,6 +42,13 @@
         } else if (TabSelectionEditorProperties.TOOLBAR_TEXT_APPEARANCE == propertyKey) {
             view.getToolbar().setTextAppearance(
                     model.get(TabSelectionEditorProperties.TOOLBAR_TEXT_APPEARANCE));
+        } else if (TabSelectionEditorProperties.TOOLBAR_ACTION_BUTTON_TEXT == propertyKey) {
+            view.getToolbar().setActionButtonText(
+                    model.get(TabSelectionEditorProperties.TOOLBAR_ACTION_BUTTON_TEXT));
+        } else if (TabSelectionEditorProperties.TOOLBAR_ACTION_BUTTON_ENABLING_THRESHOLD
+                == propertyKey) {
+            view.getToolbar().setActionButtonEnablingThreshold(model.get(
+                    TabSelectionEditorProperties.TOOLBAR_ACTION_BUTTON_ENABLING_THRESHOLD));
         }
     }
 }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java
index b4b302e..3ac9551 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java
@@ -100,7 +100,7 @@
 
         mModel.set(
                 TabSelectionEditorProperties.TOOLBAR_NAVIGATION_LISTENER, mNavigationClickListener);
-        mModel.set(TabSelectionEditorProperties.TOOLBAR_GROUP_BUTTON_LISTENER,
+        mModel.set(TabSelectionEditorProperties.TOOLBAR_ACTION_BUTTON_LISTENER,
                 mGroupButtonOnClickListener);
 
         mTabModelObserver = new TabModelSelectorTabModelObserver(mTabModelSelector) {
@@ -175,16 +175,35 @@
     }
 
     @Override
-    public void show() {
-        List<Tab> nonGroupedTabs = mTabModelSelector.getTabModelFilterProvider()
-                                           .getCurrentTabModelFilter()
-                                           .getTabsWithNoOtherRelatedTabs();
-        mResetHandler.resetWithListOfTabs(nonGroupedTabs);
+    public void show(List<Tab> tabs) {
+        mResetHandler.resetWithListOfTabs(tabs);
         mSelectionDelegate.setSelectionModeEnabledForZeroItems(true);
         mModel.set(TabSelectionEditorProperties.IS_VISIBLE, true);
     }
 
     @Override
+    public void configureToolbar(@Nullable String actionButtonText,
+            @Nullable View.OnClickListener actionButtonOnClickListener,
+            int actionButtonEnablingThreshold,
+            @Nullable View.OnClickListener navigationButtonOnClickListener) {
+        if (actionButtonText != null) {
+            mModel.set(TabSelectionEditorProperties.TOOLBAR_ACTION_BUTTON_TEXT, actionButtonText);
+        }
+        if (actionButtonOnClickListener != null) {
+            mModel.set(TabSelectionEditorProperties.TOOLBAR_ACTION_BUTTON_LISTENER,
+                    actionButtonOnClickListener);
+        }
+        if (actionButtonEnablingThreshold != -1) {
+            mModel.set(TabSelectionEditorProperties.TOOLBAR_ACTION_BUTTON_ENABLING_THRESHOLD,
+                    actionButtonEnablingThreshold);
+        }
+        if (navigationButtonOnClickListener != null) {
+            mModel.set(TabSelectionEditorProperties.TOOLBAR_NAVIGATION_LISTENER,
+                    navigationButtonOnClickListener);
+        }
+    }
+
+    @Override
     public boolean handleBackPressed() {
         if (!isEditorVisible()) return false;
         hide();
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorProperties.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorProperties.java
index a7e0507..477da466 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorProperties.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorProperties.java
@@ -18,9 +18,16 @@
             new PropertyModel.WritableBooleanPropertyKey();
 
     public static final PropertyModel
-            .WritableObjectPropertyKey<View.OnClickListener> TOOLBAR_GROUP_BUTTON_LISTENER =
+            .WritableObjectPropertyKey<View.OnClickListener> TOOLBAR_ACTION_BUTTON_LISTENER =
             new PropertyModel.WritableObjectPropertyKey<>();
 
+    public static final PropertyModel.WritableObjectPropertyKey<String> TOOLBAR_ACTION_BUTTON_TEXT =
+            new PropertyModel.WritableObjectPropertyKey<>();
+
+    public static final PropertyModel
+            .WritableIntPropertyKey TOOLBAR_ACTION_BUTTON_ENABLING_THRESHOLD =
+            new PropertyModel.WritableIntPropertyKey();
+
     public static final PropertyModel
             .WritableObjectPropertyKey<View.OnClickListener> TOOLBAR_NAVIGATION_LISTENER =
             new PropertyModel.WritableObjectPropertyKey<>();
@@ -39,6 +46,7 @@
             new PropertyModel.WritableIntPropertyKey();
 
     public static final PropertyKey[] ALL_KEYS = new PropertyKey[] {IS_VISIBLE,
-            TOOLBAR_GROUP_BUTTON_LISTENER, TOOLBAR_NAVIGATION_LISTENER, PRIMARY_COLOR,
+            TOOLBAR_ACTION_BUTTON_LISTENER, TOOLBAR_ACTION_BUTTON_TEXT,
+            TOOLBAR_ACTION_BUTTON_ENABLING_THRESHOLD, TOOLBAR_NAVIGATION_LISTENER, PRIMARY_COLOR,
             TOOLBAR_BACKGROUND_COLOR, TOOLBAR_GROUP_BUTTON_TINT, TOOLBAR_TEXT_APPEARANCE};
 }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorToolbar.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorToolbar.java
index 467e3f2..22c411c 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorToolbar.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorToolbar.java
@@ -27,6 +27,7 @@
     private Button mGroupButton;
     @ColorInt
     private int mBackgroundColor;
+    private int mActionButtonEnablingThreshold = 2;
 
     public TabSelectionEditorToolbar(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -55,7 +56,7 @@
     @Override
     public void onSelectionStateChange(List<Integer> selectedItems) {
         super.onSelectionStateChange(selectedItems);
-        mGroupButton.setEnabled(selectedItems.size() > 1);
+        mGroupButton.setEnabled(selectedItems.size() >= mActionButtonEnablingThreshold);
     }
 
     @Override
@@ -110,4 +111,20 @@
     public void setTextAppearance(int resId) {
         mNumberRollView.setTextAppearance(resId);
     }
+
+    /**
+     * Set action button text.
+     * @param text The text to display.
+     */
+    public void setActionButtonText(String text) {
+        mGroupButton.setText(text);
+    }
+
+    /**
+     * Set the action button enabling threshold.
+     * @param threshold New threshold.
+     */
+    public void setActionButtonEnablingThreshold(int threshold) {
+        mActionButtonEnablingThreshold = threshold;
+    }
 }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java
index 28747644..2304929 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java
@@ -55,6 +55,7 @@
     private final TabGridDialogCoordinator mTabGridDialogCoordinator;
     private final TabSelectionEditorCoordinator mTabSelectionEditorCoordinator;
     private final UndoGroupSnackbarController mUndoGroupSnackbarController;
+    private final TabModelSelector mTabModelSelector;
 
     private final MenuOrKeyboardActionController
             .MenuOrKeyboardActionHandler mTabSwitcherMenuActionHandler =
@@ -62,7 +63,10 @@
                 @Override
                 public boolean handleMenuOrKeyboardAction(int id, boolean fromMenu) {
                     if (id == R.id.menu_group_tabs) {
-                        mTabSelectionEditorCoordinator.getController().show();
+                        mTabSelectionEditorCoordinator.getController().show(
+                                mTabModelSelector.getTabModelFilterProvider()
+                                        .getCurrentTabModelFilter()
+                                        .getTabsWithNoOtherRelatedTabs());
                         RecordUserAction.record("MobileMenuGroupTabs");
                         return true;
                     }
@@ -78,6 +82,8 @@
             MenuOrKeyboardActionController menuOrKeyboardActionController,
             SnackbarManager.SnackbarManageable snackbarManageable, ViewGroup container,
             @TabListCoordinator.TabListMode int mode) {
+        mTabModelSelector = tabModelSelector;
+
         PropertyModel containerViewModel = new PropertyModel(TabListContainerProperties.ALL_KEYS);
 
         mTabSelectionEditorCoordinator = new TabSelectionEditorCoordinator(
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayoutBinderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayoutBinderTest.java
new file mode 100644
index 0000000..514c34e
--- /dev/null
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayoutBinderTest.java
@@ -0,0 +1,122 @@
+// 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_management;
+
+import android.support.annotation.NonNull;
+import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.MediumTest;
+import android.support.test.filters.SmallTest;
+import android.support.v7.widget.RecyclerView;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import org.chromium.chrome.browser.widget.selection.SelectionDelegate;
+import org.chromium.chrome.tab_ui.R;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.ui.DummyUiActivityTestCase;
+import org.chromium.content_public.browser.test.util.TestThreadUtils;
+import org.chromium.ui.modelutil.PropertyModel;
+import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+/**
+ * Tests for {@link TabSelectionEditorLayoutBinder}.
+ */
+@RunWith(ChromeJUnit4ClassRunner.class)
+public class TabSelectionEditorLayoutBinderTest extends DummyUiActivityTestCase {
+    private TabSelectionEditorLayout mEditorLayoutView;
+    private PropertyModel mModel = new PropertyModel(TabSelectionEditorProperties.ALL_KEYS);
+    private PropertyModelChangeProcessor mMCP;
+    private SelectionDelegate<Integer> mSelectionDelegate = new SelectionDelegate<>();
+
+    @Override
+    public void setUpTest() throws Exception {
+        super.setUpTest();
+
+        ViewGroup view = new LinearLayout(getActivity());
+
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            getActivity().setContentView(view);
+            mEditorLayoutView =
+                    (TabSelectionEditorLayout) getActivity().getLayoutInflater().inflate(
+                            R.layout.tab_selection_editor_layout, null);
+            mEditorLayoutView.initialize(view, null, new RecyclerView.Adapter() {
+                @NonNull
+                @Override
+                public RecyclerView.ViewHolder onCreateViewHolder(
+                        @NonNull ViewGroup viewGroup, int i) {
+                    return null;
+                }
+
+                @Override
+                public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {}
+
+                @Override
+                public int getItemCount() {
+                    return 0;
+                }
+            }, mSelectionDelegate);
+        });
+        mMCP = PropertyModelChangeProcessor.create(
+                mModel, mEditorLayoutView, TabSelectionEditorLayoutBinder::bind);
+    }
+
+    @Override
+    public void tearDownTest() throws Exception {
+        mMCP.destroy();
+        super.tearDownTest();
+    }
+
+    @Test
+    @SmallTest
+    @UiThreadTest
+    public void testBindViews() {
+        // TODO(1005929): test other properties as well.
+        mModel.set(TabSelectionEditorProperties.TOOLBAR_ACTION_BUTTON_TEXT, "Test");
+        Assert.assertEquals("Test",
+                ((TextView) mEditorLayoutView.findViewById(R.id.action_button))
+                        .getText()
+                        .toString());
+    }
+
+    @Test
+    @SmallTest
+    @UiThreadTest
+    public void testBindActionButtonClickListener() {
+        AtomicBoolean actionButtonClicked = new AtomicBoolean(false);
+        mModel.set(TabSelectionEditorProperties.TOOLBAR_ACTION_BUTTON_LISTENER,
+                v -> { actionButtonClicked.set(true); });
+        mEditorLayoutView.findViewById(R.id.action_button).performClick();
+        assertTrue(actionButtonClicked.get());
+    }
+
+    @Test
+    @MediumTest
+    @UiThreadTest
+    public void testActionButtonEnabling() {
+        Button button = mEditorLayoutView.findViewById(R.id.action_button);
+        mModel.set(TabSelectionEditorProperties.TOOLBAR_ACTION_BUTTON_ENABLING_THRESHOLD, 1);
+        assertFalse(button.isEnabled());
+
+        HashSet<Integer> selectedItem = new HashSet<>(Arrays.asList(1));
+        mSelectionDelegate.setSelectedItems(selectedItem);
+        assertTrue(button.isEnabled());
+
+        mModel.set(TabSelectionEditorProperties.TOOLBAR_ACTION_BUTTON_ENABLING_THRESHOLD, 2);
+        mSelectionDelegate.setSelectedItems(selectedItem);
+        assertFalse(button.isEnabled());
+    }
+}
\ No newline at end of file
diff --git a/chrome/android/features/tab_ui/tab_management_java_sources.gni b/chrome/android/features/tab_ui/tab_management_java_sources.gni
index 410c8c0..20daa58 100644
--- a/chrome/android/features/tab_ui/tab_management_java_sources.gni
+++ b/chrome/android/features/tab_ui/tab_management_java_sources.gni
@@ -26,6 +26,7 @@
   "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelViewBinderTest.java",
   "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinderTest.java",
   "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java",
+  "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorLayoutBinderTest.java",
   "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TestRecyclerViewSimpleViewBinder.java",
 ]
 
diff --git a/chrome/android/java/res/layout/main.xml b/chrome/android/java/res/layout/main.xml
index 5c8b7ef..f1600c9c 100644
--- a/chrome/android/java/res/layout/main.xml
+++ b/chrome/android/java/res/layout/main.xml
@@ -92,6 +92,13 @@
             android:layout_height="wrap_content" />
 
         <ViewStub
+            android:id="@+id/status_indicator_stub"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:inflatedId="@+id/status_indicator"
+            android:layout="@layout/status_indicator_container" />
+
+        <ViewStub
             android:id="@+id/empty_container_stub"
             android:inflatedId="@+id/empty_container"
             android:layout="@layout/empty_background_view_tablet"
diff --git a/chrome/android/java/res/layout/status_indicator_container.xml b/chrome/android/java/res/layout/status_indicator_container.xml
new file mode 100644
index 0000000..3ed7dde
--- /dev/null
+++ b/chrome/android/java/res/layout/status_indicator_container.xml
@@ -0,0 +1,21 @@
+<?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. -->
+
+<org.chromium.chrome.browser.widget.ViewResourceFrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/status_indicator"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@android:color/black">
+
+    <org.chromium.chrome.browser.ui.widget.text.TextViewWithCompoundDrawables
+        android:id="@+id/status_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:minHeight="20dp"
+        android:textAlignment="center"
+        android:drawablePadding="8dp" />
+</org.chromium.chrome.browser.widget.ViewResourceFrameLayout>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/DefaultBrowserInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/DefaultBrowserInfo.java
index 2e916c9..b10aade 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/DefaultBrowserInfo.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/DefaultBrowserInfo.java
@@ -38,7 +38,7 @@
  * A utility class for querying information about the default browser setting.
  */
 public final class DefaultBrowserInfo {
-    private static final String SAMPLE_URL = "https://www.madeupdomainforcheck123.com/";
+    private static final String SAMPLE_URL = "https://www.madeupdomainforcheck123.chrome/";
 
     /**
      * A list of potential default browser states.  To add a type to this list please update
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/DeviceConditions.java b/chrome/android/java/src/org/chromium/chrome/browser/DeviceConditions.java
index 1697fc1..7aa2324 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/DeviceConditions.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/DeviceConditions.java
@@ -184,7 +184,7 @@
         KeyguardManager keyguardManager =
                 (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
         return keyguardManager != null && !keyguardManager.isKeyguardLocked()
-                && ApiCompatibilityUtils.isInteractive(context);
+                && ApiCompatibilityUtils.isInteractive();
     }
 
     private static Intent getBatteryStatus(Context context) {
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 134c5d9..56e0dd02 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java
@@ -1028,7 +1028,7 @@
         // Only process Intents if the screen is on and the device is unlocked;
         // i.e. the user will see what is going on.
         Context appContext = ContextUtils.getApplicationContext();
-        if (!ApiCompatibilityUtils.isInteractive(appContext)) return false;
+        if (!ApiCompatibilityUtils.isInteractive()) return false;
         if (!isDeviceProvisioned(appContext)) return true;
         return !((KeyguardManager) appContext.getSystemService(Context.KEYGUARD_SERVICE))
                 .inKeyguardRestrictedInputMode();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/PowerBroadcastReceiver.java b/chrome/android/java/src/org/chromium/chrome/browser/PowerBroadcastReceiver.java
index f131a30d..2ed4578 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/PowerBroadcastReceiver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/PowerBroadcastReceiver.java
@@ -44,7 +44,7 @@
     static class PowerManagerHelper {
         /** @return whether the screen is on or not. */
         public boolean isScreenOn(Context context) {
-            return ApiCompatibilityUtils.isInteractive(context);
+            return ApiCompatibilityUtils.isInteractive();
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java
index ca9c900..79da58a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java
@@ -856,6 +856,15 @@
         // Nothing to do here yet.
     }
 
+    // TODO(crbug.com/1002519): This should be a temporary solution until the scene layer ownership
+    // is redone and the toolbar component owns its scene layer.
+    /**
+     * @return The {@link ToolbarSceneLayer}.
+     */
+    public ToolbarSceneLayer getToolbarSceneLayer() {
+        return mToolbarOverlay;
+    }
+
     /**
      * @return The {@link EdgeSwipeHandler} responsible for processing swipe events for the toolbar.
      *         By default this returns null.
@@ -873,7 +882,7 @@
     }
 
     /**
-     * Set the {@link SceneOverlay} and add it to the layout.
+     * Set the status indicator {@link SceneOverlay} to be added to the layout.
      * @param overlay The {@link SceneOverlay} to set.
      */
     public void setStatusIndicatorSceneOverlay(SceneOverlay overlay) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ToolbarSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ToolbarSceneLayer.java
index 8d321c0..d4675857 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ToolbarSceneLayer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ToolbarSceneLayer.java
@@ -49,6 +49,9 @@
     /** A LayoutRenderHost for accessing drawing information about the toolbar. */
     private LayoutRenderHost mRenderHost;
 
+    /** The static Y offset for the cases where there is a another cc layer above the toolbar. */
+    private int mStaticYOffset;
+
     /**
      * @param context An Android context to use.
      * @param provider A LayoutProvider for accessing the current layout.
@@ -62,6 +65,14 @@
     }
 
     /**
+     * Set a static Y offset for the toolbar.
+     * @param staticYOffset The Y offset in pixels.
+     */
+    public void setStaticYOffset(int staticYOffset) {
+        mStaticYOffset = staticYOffset;
+    }
+
+    /**
      * Update the toolbar and progress bar layers.
      *
      * @param browserControlsBackgroundColor The background color of the browser controls.
@@ -114,7 +125,8 @@
         ToolbarSceneLayerJni.get().updateToolbarLayer(mNativePtr, ToolbarSceneLayer.this,
                 resourceManager, R.id.control_container, browserControlsBackgroundColor,
                 textBoxResourceId, browserControlsUrlBarAlpha, textBoxColor,
-                fullscreenManager.getTopControlOffset(), windowHeight, useTexture, showShadow);
+                fullscreenManager.getTopControlOffset() + mStaticYOffset, windowHeight, useTexture,
+                showShadow);
 
         if (mProgressBarDrawingInfo == null) return;
         ToolbarSceneLayerJni.get().updateProgressBar(mNativePtr, ToolbarSceneLayer.this,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionService.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionService.java
index 46e0a666..e1e8fcc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionService.java
@@ -14,7 +14,6 @@
 import androidx.browser.customtabs.CustomTabsService;
 import androidx.browser.customtabs.CustomTabsSessionToken;
 
-import org.chromium.base.ContextUtils;
 import org.chromium.chrome.browser.browserservices.Origin;
 import org.chromium.chrome.browser.firstrun.FirstRunFlowSequencer;
 import org.chromium.chrome.browser.init.ProcessInitializationHandler;
@@ -114,8 +113,8 @@
 
     private boolean isFirstRunDone() {
         if (mBindIntent == null) return true;
-        boolean firstRunNecessary = FirstRunFlowSequencer.checkIfFirstRunIsNecessary(
-                ContextUtils.getApplicationContext(), mBindIntent, false);
+        boolean firstRunNecessary =
+                FirstRunFlowSequencer.checkIfFirstRunIsNecessary(mBindIntent, false);
         if (!firstRunNecessary) {
             mBindIntent = null;
             return true;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/SpaceDisplay.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/SpaceDisplay.java
index ede11fe0..8f8d9f3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/SpaceDisplay.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/SpaceDisplay.java
@@ -12,7 +12,6 @@
 import android.view.ViewGroup;
 import android.widget.TextView;
 
-import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.Callback;
 import org.chromium.base.Log;
 import org.chromium.base.ObserverList;
@@ -72,12 +71,12 @@
             if (downloadDirectory.exists()) {
                 StatFs statFs = new StatFs(downloadDirectory.getPath());
                 if (mFetchTotalSize) {
-                    blocks = ApiCompatibilityUtils.getBlockCount(statFs);
+                    blocks = statFs.getBlockCountLong();
                 } else {
-                    blocks = ApiCompatibilityUtils.getAvailableBlocks(statFs);
+                    blocks = statFs.getAvailableBlocksLong();
                 }
 
-                return blocks * ApiCompatibilityUtils.getBlockSize(statFs);
+                return blocks * statFs.getBlockSizeLong();
             } else {
                 Log.e(TAG, "Download directory doesn't exist.");
                 return 0L;
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 f25cfd2..7dc16b0 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
@@ -344,6 +344,82 @@
         return true;
     }
 
+    // http://crbug.com/159153: Don't override navigation from a chrome:* url to http or https.
+    // For example when clicking a link in bookmarks or most visited. When navigating from such
+    // a page, there is clear intent to complete the navigation in Chrome.
+    private boolean isLinkFromChromeInternalPage(ExternalNavigationParams params) {
+        if (params.getReferrerUrl() == null) return false;
+        if (params.getReferrerUrl().startsWith(UrlConstants.CHROME_URL_PREFIX)
+                && (params.getUrl().startsWith(UrlConstants.HTTP_URL_PREFIX)
+                        || params.getUrl().startsWith(UrlConstants.HTTPS_URL_PREFIX))) {
+            if (DEBUG) Log.i(TAG, "NO_OVERRIDE: Link from an internal chrome:// page");
+            return true;
+        }
+        return false;
+    }
+
+    private boolean handleWtaiMcProtocol(ExternalNavigationParams params) {
+        if (!params.getUrl().startsWith(WTAI_MC_URL_PREFIX)) return false;
+        // wtai://wp/mc;number
+        // number=string(phone-number)
+        mDelegate.startActivity(
+                new Intent(Intent.ACTION_VIEW,
+                        Uri.parse(WebView.SCHEME_TEL
+                                + params.getUrl().substring(WTAI_MC_URL_PREFIX.length()))),
+                false);
+        if (DEBUG) Log.i(TAG, "OVERRIDE_WITH_EXTERNAL_INTENT wtai:// link handled");
+        RecordUserAction.record("Android.PhoneIntent");
+        return true;
+    }
+
+    private boolean isUnhandledWtaiProtocol(ExternalNavigationParams params) {
+        if (!params.getUrl().startsWith(WTAI_URL_PREFIX)) return false;
+        if (DEBUG) Log.i(TAG, "NO_OVERRIDE: Unsupported wtai:// link");
+        return true;
+    }
+
+    // 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.
+    private boolean hasInternalScheme(ExternalNavigationParams params) {
+        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.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 true;
+        }
+        return false;
+    }
+
+    // The "content:" scheme is disabled in Clank. Do not try to start an activity.
+    private boolean hasContentScheme(ExternalNavigationParams params) {
+        if (!params.getUrl().startsWith(UrlConstants.CONTENT_URL_SHORT_PREFIX)) return false;
+        if (DEBUG) Log.i(TAG, "NO_OVERRIDE: Navigation to content: URL");
+        return true;
+    }
+
+    // Special case - It makes no sense to use an external application for a YouTube
+    // pairing code URL, since these match the current tab with a device (Chromecast
+    // or similar) it is supposed to be controlling. Using a different application
+    // that isn't expecting this (in particular YouTube) doesn't work.
+    private boolean isYoutubePairingCode(ExternalNavigationParams params) {
+        if (params.getUrl().matches(".*youtube\\.com(\\/.*)?\\?(.+&)?pairingCode=[^&].+")) {
+            if (DEBUG) Log.i(TAG, "NO_OVERRIDE: YouTube URL with a pairing code");
+            return true;
+        }
+        return false;
+    }
+
+    private boolean externalIntentRequestsDisabled() {
+        // TODO(changwan): check if we need to handle URL even when external intent is off.
+        if (CommandLine.getInstance().hasSwitch(ChromeSwitches.DISABLE_EXTERNAL_INTENT_REQUESTS)) {
+            Log.w(TAG, "External intent handling is disabled by a command-line flag.");
+            return true;
+        }
+        return false;
+    }
+
     private @OverrideUrlLoadingResult int shouldOverrideUrlLoadingInternal(
             ExternalNavigationParams params, Intent intent, boolean hasBrowserFallbackUrl,
             String browserFallbackUrl) {
@@ -352,10 +428,6 @@
             return OverrideUrlLoadingResult.NO_OVERRIDE;
         }
 
-        int pageTransitionCore = params.getPageTransition() & PageTransition.CORE_MASK;
-        boolean isLink = pageTransitionCore == PageTransition.LINK;
-        boolean isFormSubmit = pageTransitionCore == PageTransition.FORM_SUBMIT;
-        boolean isFromIntent = (params.getPageTransition() & PageTransition.FROM_API) != 0;
         boolean isExternalProtocol = !UrlUtilities.isAcceptedScheme(params.getUrl());
 
         if (isInternalPdfDownload(isExternalProtocol, params)) {
@@ -368,18 +440,28 @@
             return OverrideUrlLoadingResult.OVERRIDE_WITH_ASYNC_ACTION;
         }
 
+        // This should come after file intents, but before any returns of
+        // OVERRIDE_WITH_EXTERNAL_INTENT.
+        if (externalIntentRequestsDisabled()) return OverrideUrlLoadingResult.NO_OVERRIDE;
+
+        int pageTransitionCore = params.getPageTransition() & PageTransition.CORE_MASK;
+        boolean isLink = pageTransitionCore == PageTransition.LINK;
+        boolean isFormSubmit = pageTransitionCore == PageTransition.FORM_SUBMIT;
+        boolean isFromIntent = (params.getPageTransition() & PageTransition.FROM_API) != 0;
+
         // http://crbug.com/149218: We want to show the intent picker for ordinary links, providing
         // the link is not an incoming intent from another application, unless it's a redirect (see
         // below).
         boolean linkNotFromIntent = isLink && !isFromIntent;
 
-        boolean isOnEffectiveIntentRedirect = params.getRedirectHandler() == null ? false
+        boolean isOnEffectiveIntentRedirect = params.getRedirectHandler() == null
+                ? false
                 : params.getRedirectHandler().isOnEffectiveIntentRedirectChain();
 
         // http://crbug.com/170925: We need to show the intent picker when we receive an intent from
         // another app that 30x redirects to a YouTube/Google Maps/Play Store/Google+ URL etc.
-        boolean incomingIntentRedirect = (isLink && isFromIntent && params.isRedirect())
-                || isOnEffectiveIntentRedirect;
+        boolean incomingIntentRedirect =
+                (isLink && isFromIntent && params.isRedirect()) || isOnEffectiveIntentRedirect;
 
         // Don't stay in Chrome for Custom Tabs redirecting to Instant Apps.
         if (handleCCTRedirectsToInstantApps(params, isExternalProtocol, incomingIntentRedirect)) {
@@ -393,66 +475,19 @@
             return OverrideUrlLoadingResult.NO_OVERRIDE;
         }
 
-        // http://crbug.com/159153: Don't override navigation from a chrome:* url to http or https.
-        // For example when clicking a link in bookmarks or most visited. When navigating from such
-        // a page, there is clear intent to complete the navigation in Chrome.
-        if (params.getReferrerUrl() != null
-                && params.getReferrerUrl().startsWith(UrlConstants.CHROME_URL_PREFIX)
-                && (params.getUrl().startsWith(UrlConstants.HTTP_URL_PREFIX)
-                        || params.getUrl().startsWith(UrlConstants.HTTPS_URL_PREFIX))) {
-            if (DEBUG) Log.i(TAG, "NO_OVERRIDE: Link from an internal chrome:// page");
-            return OverrideUrlLoadingResult.NO_OVERRIDE;
-        }
+        if (isLinkFromChromeInternalPage(params)) return OverrideUrlLoadingResult.NO_OVERRIDE;
 
-        if (params.getUrl().startsWith(WTAI_MC_URL_PREFIX)) {
-            // wtai://wp/mc;number
-            // number=string(phone-number)
-            mDelegate.startActivity(new Intent(Intent.ACTION_VIEW,
-                    Uri.parse(WebView.SCHEME_TEL
-                            + params.getUrl().substring(WTAI_MC_URL_PREFIX.length()))), false);
-            if (DEBUG) Log.i(TAG, "OVERRIDE_WITH_EXTERNAL_INTENT wtai:// link handled");
-            RecordUserAction.record("Android.PhoneIntent");
+        if (handleWtaiMcProtocol(params)) {
             return OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT;
         }
+        // TODO: handle other WTAI schemes.
+        if (isUnhandledWtaiProtocol(params)) return OverrideUrlLoadingResult.NO_OVERRIDE;
 
-        if (params.getUrl().startsWith(WTAI_URL_PREFIX)) {
-            // TODO: handle other WTAI schemes.
-            if (DEBUG) Log.i(TAG, "NO_OVERRIDE: Unsupported wtai:// link");
-            return OverrideUrlLoadingResult.NO_OVERRIDE;
-        }
+        if (hasInternalScheme(params)) return OverrideUrlLoadingResult.NO_OVERRIDE;
 
-        // 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.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;
-        }
+        if (hasContentScheme(params)) return OverrideUrlLoadingResult.NO_OVERRIDE;
 
-        // The "content:" scheme is disabled in Clank. Do not try to start an activity.
-        if (params.getUrl().startsWith(UrlConstants.CONTENT_URL_SHORT_PREFIX)) {
-            if (DEBUG) Log.i(TAG, "NO_OVERRIDE: Navigation to content: URL");
-            return OverrideUrlLoadingResult.NO_OVERRIDE;
-        }
-
-        // Special case - It makes no sense to use an external application for a YouTube
-        // pairing code URL, since these match the current tab with a device (Chromecast
-        // or similar) it is supposed to be controlling. Using a different application
-        // that isn't expecting this (in particular YouTube) doesn't work.
-        if (params.getUrl().matches(".*youtube\\.com(\\/.*)?\\?(.+&)?pairingCode=[^&].+")) {
-            if (DEBUG) Log.i(TAG, "NO_OVERRIDE: YouTube URL with a pairing code");
-            return OverrideUrlLoadingResult.NO_OVERRIDE;
-        }
-
-        // TODO(changwan): check if we need to handle URL even when external intent is off.
-        if (CommandLine.getInstance().hasSwitch(
-                ChromeSwitches.DISABLE_EXTERNAL_INTENT_REQUESTS)) {
-            Log.w(TAG, "External intent handling is disabled by a command-line flag.");
-            return OverrideUrlLoadingResult.NO_OVERRIDE;
-        }
+        if (isYoutubePairingCode(params)) return OverrideUrlLoadingResult.NO_OVERRIDE;
 
         // http://crbug.com/647569 : Stay in a PWA window for a URL within the same scope.
         @WebappScopePolicy.NavigationDirective
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/feedback/SystemInfoFeedbackSource.java b/chrome/android/java/src/org/chromium/chrome/browser/feedback/SystemInfoFeedbackSource.java
index 4f3acc95..5fb4b02d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/feedback/SystemInfoFeedbackSource.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/feedback/SystemInfoFeedbackSource.java
@@ -9,7 +9,6 @@
 import android.os.StatFs;
 import android.util.Pair;
 
-import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.CollectionUtil;
 import org.chromium.base.LocaleUtils;
 import org.chromium.base.annotations.JNINamespace;
@@ -46,11 +45,11 @@
 
         StatFs statFs = getResult();
         if (statFs != null) {
-            long blockSize = ApiCompatibilityUtils.getBlockSize(statFs);
-            long availSpace = ConversionUtils.bytesToMegabytes(
-                    ApiCompatibilityUtils.getAvailableBlocks(statFs) * blockSize);
-            long totalSpace = ConversionUtils.bytesToMegabytes(
-                    ApiCompatibilityUtils.getBlockCount(statFs) * blockSize);
+            long blockSize = statFs.getBlockSizeLong();
+            long availSpace =
+                    ConversionUtils.bytesToMegabytes(statFs.getAvailableBlocksLong() * blockSize);
+            long totalSpace =
+                    ConversionUtils.bytesToMegabytes(statFs.getBlockCountLong() * blockSize);
 
             feedback.put("Available Storage (MB)", Long.toString(availSpace));
             feedback.put("Total Storage (MB)", Long.toString(totalSpace));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
index ae42874..ce32618 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
@@ -73,7 +73,7 @@
      */
     public void start() {
         if (CommandLine.getInstance().hasSwitch(ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE)
-                || ApiCompatibilityUtils.isDemoUser(mActivity)) {
+                || ApiCompatibilityUtils.isDemoUser()) {
             onFlowIsKnown(null);
             return;
         }
@@ -228,16 +228,15 @@
 
     /**
      * Checks if the First Run needs to be launched.
-     * @param context The context.
      * @param fromIntent The intent that was used to launch Chrome.
      * @param preferLightweightFre Whether to prefer the Lightweight First Run Experience.
      * @return Whether the First Run Experience needs to be launched.
      */
     public static boolean checkIfFirstRunIsNecessary(
-            Context context, Intent fromIntent, boolean preferLightweightFre) {
+            Intent fromIntent, boolean preferLightweightFre) {
         // If FRE is disabled (e.g. in tests), proceed directly to the intent handling.
         if (CommandLine.getInstance().hasSwitch(ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE)
-                || ApiCompatibilityUtils.isDemoUser(context)) {
+                || ApiCompatibilityUtils.isDemoUser()) {
             return false;
         }
 
@@ -270,7 +269,7 @@
     public static boolean launch(Context caller, Intent fromIntent, boolean requiresBroadcast,
             boolean preferLightweightFre) {
         // Check if the user needs to go through First Run at all.
-        if (!checkIfFirstRunIsNecessary(caller, fromIntent, preferLightweightFre)) return false;
+        if (!checkIfFirstRunIsNecessary(fromIntent, preferLightweightFre)) return false;
 
         String intentUrl = IntentHandler.getUrlFromIntent(fromIntent);
         Uri uri = intentUrl != null ? Uri.parse(intentUrl) : null;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/NativeInitializationController.java b/chrome/android/java/src/org/chromium/chrome/browser/init/NativeInitializationController.java
index 3237677..0dbd6c19f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/NativeInitializationController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/NativeInitializationController.java
@@ -6,7 +6,6 @@
 
 import android.content.Intent;
 
-import org.chromium.base.ContextUtils;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.library_loader.LibraryLoader;
 import org.chromium.chrome.browser.firstrun.FirstRunFlowSequencer;
@@ -71,7 +70,7 @@
         ThreadUtils.assertOnUiThread();
         assert mBackgroundTasksComplete == null;
         boolean fetchVariationsSeed = FirstRunFlowSequencer.checkIfFirstRunIsNecessary(
-                ContextUtils.getApplicationContext(), mActivityDelegate.getInitialIntent(), false);
+                mActivityDelegate.getInitialIntent(), false);
 
         mBackgroundTasksComplete = false;
         new AsyncInitTaskRunner() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
index 89189aa..3754b51 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
@@ -18,7 +18,6 @@
 
 import com.google.ipc.invalidation.external.client.android.service.AndroidLogger;
 
-import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.CommandLine;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.Log;
@@ -415,7 +414,7 @@
                             DownloadManagerService.getDownloadManagerService());
                 }
 
-                if (ApiCompatibilityUtils.isPrintingSupported()) {
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                     String errorText = ContextUtils.getApplicationContext().getString(
                             R.string.error_printing_failed);
                     PrintingControllerImpl.create(new PrintDocumentAdapterWrapper(), errorText);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java b/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
index dd55967..267b6fc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
@@ -259,7 +259,7 @@
             }
         };
         if (TemplateUrlServiceFactory.get().isDefaultSearchManaged()
-                || ApiCompatibilityUtils.isDemoUser(activity)) {
+                || ApiCompatibilityUtils.isDemoUser()) {
             finalizeInternalCallback.onResult(true);
             return;
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaSessionTabHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaSessionTabHelper.java
index eaea23e..cf6225c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaSessionTabHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaSessionTabHelper.java
@@ -327,9 +327,7 @@
             try {
                 URI uri = new URI(origin);
                 origin = UrlFormatter.formatUrlForSecurityDisplay(origin);
-            } catch (URISyntaxException | UnsatisfiedLinkError e) {
-                // UnstatisfiedLinkError can only happen in tests as the natives are not initialized
-                // yet.
+            } catch (URISyntaxException e) {
                 Log.e(TAG, "Unable to parse the origin from the URL. "
                                 + "Using the full URL instead.");
             }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/CustomNotificationBuilder.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/CustomNotificationBuilder.java
index 8a976f7..78b16e6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/CustomNotificationBuilder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/CustomNotificationBuilder.java
@@ -250,7 +250,7 @@
 
         Drawable inputDrawable = new BitmapDrawable(resources, bitmap);
         Drawable outputDrawable = ApiCompatibilityUtils.getUserBadgedDrawableForDensity(
-                mContext, inputDrawable, null /* badgeLocation */, metrics.densityDpi);
+                inputDrawable, null /* badgeLocation */, metrics.densityDpi);
 
         // The input bitmap is immutable, so the output drawable will be a different instance from
         // the input drawable if the work profile badge was applied.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaDelegateBase.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaDelegateBase.java
index b6af961..46cc97bf 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaDelegateBase.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaDelegateBase.java
@@ -47,7 +47,7 @@
     @Override
     boolean isChromeBeingUsed() {
         boolean isChromeVisible = ApplicationStatus.hasVisibleActivities();
-        boolean isScreenOn = ApiCompatibilityUtils.isInteractive(getContext());
+        boolean isScreenOn = ApiCompatibilityUtils.isInteractive();
         return isChromeVisible && isScreenOn;
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilder.java b/chrome/android/java/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilder.java
index 6bb1f27..0901efb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilder.java
@@ -95,7 +95,7 @@
             } else if (shouldShowNotificationsDisabledWarning(permission)) {
                 permissionParams.warningTextResource =
                         R.string.page_info_android_permission_blocked;
-                intentOverride = ApiCompatibilityUtils.getNotificationSettingsIntent(mContext);
+                intentOverride = ApiCompatibilityUtils.getNotificationSettingsIntent();
             } else if (!hasAndroidPermission(permission.type)) {
                 permissionParams.warningTextResource =
                         R.string.page_info_android_permission_blocked;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProvider.java
index b9b3c5ef..b8bfead 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProvider.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProvider.java
@@ -406,8 +406,7 @@
     }
 
     static boolean shouldShowFullString() {
-        boolean freIsNotNecessary = !FirstRunFlowSequencer.checkIfFirstRunIsNecessary(
-                getDelegate().getContext(), null, false);
+        boolean freIsNotNecessary = !FirstRunFlowSequencer.checkIfFirstRunIsNecessary(null, false);
         boolean noNeedToCheckForSearchDialog =
                 !LocaleManager.getInstance().needToCheckForSearchEnginePromo();
         return freIsNotNecessary && noNeedToCheckForSearchDialog;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
index 91fe0c95..4db1013 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
@@ -306,7 +306,7 @@
      *         Google Play Services installed.
      */
     public boolean isSigninSupported() {
-        return !ApiCompatibilityUtils.isDemoUser(mContext) && isGooglePlayServicesPresent(mContext)
+        return !ApiCompatibilityUtils.isDemoUser() && isGooglePlayServicesPresent(mContext)
                 && !SigninManagerJni.get().isMobileIdentityConsistencyEnabled();
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorCoordinator.java
index 636a7cf8..db88638 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorCoordinator.java
@@ -4,24 +4,110 @@
 
 package org.chromium.chrome.browser.status_indicator;
 
+import android.app.Activity;
+import android.graphics.drawable.Drawable;
+import android.view.View;
+import android.view.ViewStub;
+
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.widget.ViewResourceFrameLayout;
+import org.chromium.ui.modelutil.PropertyModel;
+import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
+import org.chromium.ui.resources.ResourceManager;
+
+import java.util.HashSet;
+
 /**
  * The coordinator for a status indicator that is positioned below the status bar and is persistent.
  * Typically used to relay status, e.g. indicate user is offline.
  */
 public class StatusIndicatorCoordinator {
-    private StatusIndicatorSceneLayer mSceneLayer;
+    /** An observer that will be notified of the changes to the status indicator, e.g. height. */
+    public interface StatusIndicatorObserver {
+        /**
+         * Called when the height of the status indicator changes.
+         * @param newHeight The new height in pixels.
+         */
+        void onStatusIndicatorHeightChanged(int newHeight);
+    }
 
-    public StatusIndicatorCoordinator() {
-        mSceneLayer = new StatusIndicatorSceneLayer();
+    private PropertyModel mModel;
+    private View mView;
+    private StatusIndicatorSceneLayer mSceneLayer;
+    private HashSet<StatusIndicatorObserver> mObservers = new HashSet<>();
+
+    public StatusIndicatorCoordinator(Activity activity, ResourceManager resourceManager) {
+        // TODO(crbug.com/1005843): Create this view lazily if/when we need it. This is a task for
+        // when we have the public API figured out.
+        final ViewStub stub = activity.findViewById(R.id.status_indicator_stub);
+        ViewResourceFrameLayout root = (ViewResourceFrameLayout) stub.inflate();
+        mView = root;
+        mSceneLayer = new StatusIndicatorSceneLayer(root);
+        mModel = new PropertyModel.Builder(StatusIndicatorProperties.ALL_KEYS)
+                         .with(StatusIndicatorProperties.ANDROID_VIEW_VISIBLE, false)
+                         .with(StatusIndicatorProperties.COMPOSITED_VIEW_VISIBLE, false)
+                         .build();
+        PropertyModelChangeProcessor.create(mModel,
+                new StatusIndicatorViewBinder.ViewHolder(root, mSceneLayer),
+                StatusIndicatorViewBinder::bind);
+        resourceManager.getDynamicResourceLoader().registerResource(
+                root.getId(), root.getResourceAdapter());
     }
 
     /**
-     * Change the visibility of the status indicator.
-     * @param visible True if visible.
+     * Set the {@link String} the status indicator should display.
+     * @param statusText The string.
      */
-    public void setIsVisible(boolean visible) {
-        assert mSceneLayer != null;
-        mSceneLayer.setIsVisible(visible);
+    public void setStatusText(String statusText) {
+        mModel.set(StatusIndicatorProperties.STATUS_TEXT, statusText);
+    }
+
+    /**
+     * Set the {@link Drawable} the status indicator should display next to the status text.
+     * @param statusIcon The icon drawable.
+     */
+    public void setStatusIcon(Drawable statusIcon) {
+        mModel.set(StatusIndicatorProperties.STATUS_ICON, statusIcon);
+    }
+
+    // TODO(sinansahin): With animation.
+    // TODO(sinansahin): Destroy the view when not needed.
+    /** Show the status indicator. */
+    public void show() {
+        mModel.set(StatusIndicatorProperties.COMPOSITED_VIEW_VISIBLE, true);
+        mModel.set(StatusIndicatorProperties.ANDROID_VIEW_VISIBLE, true);
+        // TODO(crbug.com/1005843): We will need a measure pass before we can get the real height of
+        // this view. We should keep this in mind when inflating the view lazily.
+        mView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
+            @Override
+            public void onLayoutChange(View v, int left, int top, int right, int bottom,
+                    int oldLeft, int oldTop, int oldRight, int oldBottom) {
+                final int height = v.getHeight();
+                for (StatusIndicatorObserver observer : mObservers) {
+                    observer.onStatusIndicatorHeightChanged(height);
+                }
+                mView.removeOnLayoutChangeListener(this);
+            }
+        });
+    }
+
+    // TODO(sinansahin): With animation as well.
+    /** Hide the status indicator. */
+    public void hide() {
+        mModel.set(StatusIndicatorProperties.COMPOSITED_VIEW_VISIBLE, false);
+        mModel.set(StatusIndicatorProperties.ANDROID_VIEW_VISIBLE, false);
+
+        for (StatusIndicatorObserver observer : mObservers) {
+            observer.onStatusIndicatorHeightChanged(0);
+        }
+    }
+
+    public void addObserver(StatusIndicatorObserver observer) {
+        mObservers.add(observer);
+    }
+
+    public void removeObserver(StatusIndicatorObserver observer) {
+        mObservers.remove(observer);
     }
 
     /**
@@ -29,7 +115,7 @@
      * @return True if visible.
      */
     public boolean isVisible() {
-        return mSceneLayer.isSceneOverlayTreeShowing();
+        return mModel.get(StatusIndicatorProperties.COMPOSITED_VIEW_VISIBLE);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorProperties.java b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorProperties.java
new file mode 100644
index 0000000..97769d97
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorProperties.java
@@ -0,0 +1,31 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.status_indicator;
+
+import android.graphics.drawable.Drawable;
+
+import org.chromium.ui.modelutil.PropertyKey;
+import org.chromium.ui.modelutil.PropertyModel;
+
+class StatusIndicatorProperties {
+    /** The text that describes status. */
+    static final PropertyModel.WritableObjectPropertyKey<String> STATUS_TEXT =
+            new PropertyModel.WritableObjectPropertyKey<>();
+
+    /** The {@link Drawable} that will be displayed next to the status text. */
+    static final PropertyModel.WritableObjectPropertyKey<Drawable> STATUS_ICON =
+            new PropertyModel.WritableObjectPropertyKey<>();
+
+    /** Whether the Android view version of the status indicator is visible. */
+    static final PropertyModel.WritableBooleanPropertyKey ANDROID_VIEW_VISIBLE =
+            new PropertyModel.WritableBooleanPropertyKey();
+
+    /** Whether the composited version of the status indicator is visible. */
+    static final PropertyModel.WritableBooleanPropertyKey COMPOSITED_VIEW_VISIBLE =
+            new PropertyModel.WritableBooleanPropertyKey();
+
+    static final PropertyKey[] ALL_KEYS = new PropertyKey[] {
+            STATUS_TEXT, STATUS_ICON, ANDROID_VIEW_VISIBLE, COMPOSITED_VIEW_VISIBLE};
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorSceneLayer.java
index cab7f6b..9d6fc16 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorSceneLayer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorSceneLayer.java
@@ -31,21 +31,18 @@
     /** The resource ID used to reference the view bitmap in native. */
     private int mResourceId;
 
-    private boolean mIsVisible;
+    /** The {@link ViewResourceFrameLayout} that this scene layer represents. */
+    private ViewResourceFrameLayout mStatusIndicator;
 
-    /** Build a composited status view layer. */
-    public StatusIndicatorSceneLayer() {}
+    private boolean mIsVisible;
 
     /**
      * Build a composited status view layer.
-     * @param resourceManager A resource manager for dynamic resource creation.
      * @param statusIndicator The view used to generate the composited version.
      */
-    public StatusIndicatorSceneLayer(
-            ResourceManager resourceManager, ViewResourceFrameLayout statusIndicator) {
-        mResourceId = statusIndicator.getId();
-        resourceManager.getDynamicResourceLoader().registerResource(
-                mResourceId, statusIndicator.getResourceAdapter());
+    public StatusIndicatorSceneLayer(ViewResourceFrameLayout statusIndicator) {
+        mStatusIndicator = statusIndicator;
+        mResourceId = mStatusIndicator.getId();
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorViewBinder.java
new file mode 100644
index 0000000..562684a1
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorViewBinder.java
@@ -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.
+
+package org.chromium.chrome.browser.status_indicator;
+
+import android.view.View;
+import android.widget.TextView;
+
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.widget.ViewResourceFrameLayout;
+import org.chromium.ui.modelutil.PropertyKey;
+import org.chromium.ui.modelutil.PropertyModel;
+
+class StatusIndicatorViewBinder {
+    /**
+     * A wrapper class that holds a {@link ViewResourceFrameLayout} and a composited layer to be
+     * used with the {@link StatusIndicatorSceneLayer}.
+     */
+    static class ViewHolder {
+        /** A handle to the Android View based version of the status indicator. */
+        public final ViewResourceFrameLayout javaViewRoot;
+
+        /** A handle to the composited status indicator layer. */
+        public final StatusIndicatorSceneLayer sceneLayer;
+
+        /**
+         * @param root The Android View based status indicator.
+         */
+        public ViewHolder(ViewResourceFrameLayout root, StatusIndicatorSceneLayer overlay) {
+            javaViewRoot = root;
+            sceneLayer = overlay;
+        }
+    }
+
+    static void bind(PropertyModel model, ViewHolder view, PropertyKey propertyKey) {
+        if (StatusIndicatorProperties.STATUS_TEXT == propertyKey) {
+            ((TextView) view.javaViewRoot.findViewById(R.id.status_text))
+                    .setText(model.get(StatusIndicatorProperties.STATUS_TEXT));
+        } else if (StatusIndicatorProperties.STATUS_ICON == propertyKey) {
+            ((TextView) view.javaViewRoot.findViewById(R.id.status_text))
+                    .setCompoundDrawablesRelativeWithIntrinsicBounds(
+                            model.get(StatusIndicatorProperties.STATUS_ICON), null, null, null);
+        } else if (StatusIndicatorProperties.COMPOSITED_VIEW_VISIBLE == propertyKey) {
+            assert view.sceneLayer != null;
+            view.sceneLayer.setIsVisible(
+                    model.get(StatusIndicatorProperties.COMPOSITED_VIEW_VISIBLE));
+        } else if (StatusIndicatorProperties.ANDROID_VIEW_VISIBLE == propertyKey) {
+            view.javaViewRoot.setVisibility(
+                    model.get(StatusIndicatorProperties.ANDROID_VIEW_VISIBLE) ? View.VISIBLE
+                                                                              : View.GONE);
+        } else {
+            assert false : "Unhandled property detected in StatusIndicatorViewBinder!";
+        }
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
index 430d45d8..226ca1b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
@@ -6,10 +6,14 @@
 
 import androidx.annotation.Nullable;
 
+import org.chromium.base.VisibleForTesting;
 import org.chromium.chrome.browser.AppHooks;
 import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.appmenu.AppMenuHandler;
+import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
 import org.chromium.chrome.browser.lifecycle.NativeInitObserver;
+import org.chromium.chrome.browser.status_indicator.StatusIndicatorCoordinator;
 import org.chromium.chrome.browser.ui.ImmersiveModeManager;
 import org.chromium.chrome.browser.ui.RootUiCoordinator;
 import org.chromium.chrome.browser.ui.tablet.emptybackground.EmptyBackgroundViewWrapper;
@@ -23,6 +27,9 @@
     private TabbedSystemUiCoordinator mSystemUiCoordinator;
     private @Nullable EmptyBackgroundViewWrapper mEmptyBackgroundViewWrapper;
 
+    private StatusIndicatorCoordinator mStatusIndicatorCoordinator;
+    private StatusIndicatorCoordinator.StatusIndicatorObserver mStatusIndicatorObserver;
+
     public TabbedRootUiCoordinator(ChromeActivity activity) {
         super(activity);
     }
@@ -33,6 +40,10 @@
         if (mSystemUiCoordinator != null) mSystemUiCoordinator.destroy();
         if (mEmptyBackgroundViewWrapper != null) mEmptyBackgroundViewWrapper.destroy();
 
+        if (mStatusIndicatorCoordinator != null) {
+            mStatusIndicatorCoordinator.removeObserver(mStatusIndicatorObserver);
+        }
+
         super.destroy();
     }
 
@@ -64,4 +75,39 @@
             mEmptyBackgroundViewWrapper.initialize();
         }
     }
+
+    // Protected class methods
+
+    @Override
+    protected void onLayoutManagerAvailable(LayoutManager layoutManager) {
+        super.onLayoutManagerAvailable(layoutManager);
+
+        initStatusIndicatorCoordinator(layoutManager);
+    }
+
+    // Private class methods
+
+    private void initStatusIndicatorCoordinator(LayoutManager layoutManager) {
+        if (!ChromeFeatureList.isEnabled(ChromeFeatureList.OFFLINE_INDICATOR_V2)) {
+            return;
+        }
+
+        mStatusIndicatorCoordinator = new StatusIndicatorCoordinator(
+                mActivity, mActivity.getCompositorViewHolder().getResourceManager());
+        layoutManager.setStatusIndicatorSceneOverlay(mStatusIndicatorCoordinator.getSceneLayer());
+        mStatusIndicatorObserver = (indicatorHeight -> {
+            mActivity.getToolbarManager().setControlContainerTopMargin(indicatorHeight);
+            layoutManager.getToolbarSceneLayer().setStaticYOffset(indicatorHeight);
+            final int resourceId = mActivity.getControlContainerHeightResource();
+            final int topControlsNewHeight =
+                    mActivity.getResources().getDimensionPixelSize(resourceId) + indicatorHeight;
+            mActivity.getFullscreenManager().setTopControlsHeight(topControlsNewHeight);
+        });
+        mStatusIndicatorCoordinator.addObserver(mStatusIndicatorObserver);
+    }
+
+    @VisibleForTesting
+    public StatusIndicatorCoordinator getStatusIndicatorCoordinatorForTesting() {
+        return mStatusIndicatorCoordinator;
+    }
 }
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 3ced0cd6..7bd44bc 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
@@ -17,6 +17,7 @@
 import android.view.View.OnAttachStateChangeListener;
 import android.view.View.OnClickListener;
 import android.view.View.OnLongClickListener;
+import android.view.ViewGroup;
 
 import androidx.annotation.IntDef;
 import androidx.annotation.Nullable;
@@ -1617,6 +1618,17 @@
     }
 
     /**
+     * Sets the top margin for the control container.
+     * @param margin The margin in pixels.
+     */
+    public void setControlContainerTopMargin(int margin) {
+        final ViewGroup.MarginLayoutParams layoutParams =
+                ((ViewGroup.MarginLayoutParams) mControlContainer.getLayoutParams());
+        layoutParams.topMargin = margin;
+        mControlContainer.setLayoutParams(layoutParams);
+    }
+
+    /**
      * Gets the Toolbar view.
      */
     @Nullable
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 9d2dd23a..f2a340a 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
@@ -11,7 +11,6 @@
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.MenuOrKeyboardActionController;
 import org.chromium.chrome.browser.appmenu.AppMenuBlocker;
 import org.chromium.chrome.browser.appmenu.AppMenuCoordinator;
@@ -25,7 +24,6 @@
 import org.chromium.chrome.browser.findinpage.FindToolbarObserver;
 import org.chromium.chrome.browser.lifecycle.Destroyable;
 import org.chromium.chrome.browser.lifecycle.InflationObserver;
-import org.chromium.chrome.browser.status_indicator.StatusIndicatorCoordinator;
 import org.chromium.chrome.browser.vr.VrModeObserver;
 import org.chromium.chrome.browser.vr.VrModuleProvider;
 import org.chromium.ui.base.DeviceFormFactor;
@@ -55,8 +53,6 @@
     private OverviewModeBehavior mOverviewModeBehavior;
     private OverviewModeBehavior.OverviewModeObserver mOverviewModeObserver;
 
-    private StatusIndicatorCoordinator mStatusIndicatorCoordinator;
-
     private VrModeObserver mVrModeObserver;
 
     /**
@@ -71,7 +67,9 @@
         mMenuOrKeyboardActionController = mActivity.getMenuOrKeyboardActionController();
         mMenuOrKeyboardActionController.registerMenuOrKeyboardActionHandler(this);
 
-        initLayoutManagerSupplierObserver();
+        mLayoutManagerSupplierCallback = this::onLayoutManagerAvailable;
+        mActivity.getLayoutManagerSupplier().addObserver(mLayoutManagerSupplierCallback);
+
         initOverviewModeSupplierObserver();
     }
 
@@ -80,6 +78,7 @@
         mMenuOrKeyboardActionController.unregisterMenuOrKeyboardActionHandler(this);
 
         mActivity.getLayoutManagerSupplier().removeObserver(mLayoutManagerSupplierCallback);
+
         if (mOverlayPanelManager != null) {
             mOverlayPanelManager.removeObserver(mOverlayPanelManagerObserver);
         }
@@ -175,41 +174,33 @@
         return true;
     }
 
-    // Private class methods
+    // Protected class methods
 
-    private void initLayoutManagerSupplierObserver() {
-        mLayoutManagerSupplierCallback = layoutManager -> {
-            if (mOverlayPanelManager != null) {
-                mOverlayPanelManager.removeObserver(mOverlayPanelManagerObserver);
-            }
-            mOverlayPanelManager = layoutManager.getOverlayPanelManager();
+    protected void onLayoutManagerAvailable(LayoutManager layoutManager) {
+        if (mOverlayPanelManager != null) {
+            mOverlayPanelManager.removeObserver(mOverlayPanelManagerObserver);
+        }
+        mOverlayPanelManager = layoutManager.getOverlayPanelManager();
 
-            if (mOverlayPanelManagerObserver == null) {
-                mOverlayPanelManagerObserver =
-                        new OverlayPanelManager.OverlayPanelManagerObserver() {
-                            @Override
-                            public void onOverlayPanelShown() {
-                                if (mFindToolbarManager != null) {
-                                    mFindToolbarManager.hideToolbar(false);
-                                }
-                            }
+        if (mOverlayPanelManagerObserver == null) {
+            mOverlayPanelManagerObserver = new OverlayPanelManager.OverlayPanelManagerObserver() {
+                @Override
+                public void onOverlayPanelShown() {
+                    if (mFindToolbarManager != null) {
+                        mFindToolbarManager.hideToolbar(false);
+                    }
+                }
 
-                            @Override
-                            public void onOverlayPanelHidden() {}
-                        };
-            }
+                @Override
+                public void onOverlayPanelHidden() {}
+            };
+        }
 
-            mOverlayPanelManager.addObserver(mOverlayPanelManagerObserver);
-
-            if (ChromeFeatureList.isEnabled(ChromeFeatureList.OFFLINE_INDICATOR_V2)) {
-                mStatusIndicatorCoordinator = new StatusIndicatorCoordinator();
-                layoutManager.setStatusIndicatorSceneOverlay(
-                        mStatusIndicatorCoordinator.getSceneLayer());
-            }
-        };
-        mActivity.getLayoutManagerSupplier().addObserver(mLayoutManagerSupplierCallback);
+        mOverlayPanelManager.addObserver(mOverlayPanelManagerObserver);
     }
 
+    // Private class methods
+
     private void initOverviewModeSupplierObserver() {
         if (mActivity.getOverviewModeBehaviorSupplier() != null) {
             mOverviewModeBehaviorSupplierCallback = overviewModeBehavior -> {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
index 85ea40b..53d44f0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
@@ -423,7 +423,9 @@
      */
     public boolean handleBackPress() {
         if (isSheetOpen()) {
-            setSheetState(SheetState.PEEK, true, StateChangeReason.BACK_PRESS);
+            int sheetState =
+                    mSheetContent.isPeekStateEnabled() ? SheetState.PEEK : SheetState.HIDDEN;
+            setSheetState(sheetState, true, StateChangeReason.BACK_PRESS);
             return true;
         }
 
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 248745c2..0112f0c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">ውጤቶች የሉም</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> ማያ ገጽዎን እያጋራ ነው</translation>
 <translation id="4961107849584082341">ይህን ገጽ ወደ ማንኛውም ቋንቋ ያስተርጉሙ</translation>
-<translation id="4961700429721424617">በ<ph name="MANAGED_DOMAIN" /> ከሚተዳደር መለያ ዘግተው እየወጡ ነው። ይሄ የChrome ውሂብዎን ከዚህ መሣሪያ ይሰርዘዋል፣ ነገር ግን ውሂብዎ አሁንም በእርስዎ የGoogle መለያ ውስጥ እንዳለ ይቀራል።</translation>
 <translation id="4962975101802056554">ሁሉንም የመሣሪያ ፈቃዶች ይሻሩ</translation>
 <translation id="4970824347203572753">በአካባቢዎ ውስጥ አይገኝም</translation>
 <translation id="497421865427891073">ወደ ፊት ሂድ</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">ከ<ph name="DEVICE_NAME" /> የተጋራ ጽሑፍ</translation>
 <translation id="7762668264895820836">ኤስዲ ካርድ <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">አድራሻ አክል</translation>
-<translation id="7769602470925380267">ተቀበልና ዘግተህ ውጣ</translation>
 <translation id="7772032839648071052">የይለፍ ሐረግ ያረጋግጡ</translation>
 <translation id="7772375229873196092"><ph name="APP_NAME" />ን ዝጋ</translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 እና <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> ተጨማሪ}one{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 እና <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> ተጨማሪ}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 እና <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> ተጨማሪ}}</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 d077670..eeda70e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">لا نتائج</translation>
 <translation id="4958708863221495346">يشارك <ph name="URL_OF_THE_CURRENT_TAB" /> شاشتك</translation>
 <translation id="4961107849584082341">ترجمة هذه الصفحة إلى أي لغة</translation>
-<translation id="4961700429721424617">‏أنت بصدد الخروج من حساب تتم إدارته من خلال <ph name="MANAGED_DOMAIN" />. سيؤدي ذلك إلى حذف بيانات Chrome من هذا الجهاز، ولكن ستظل البيانات في حسابك في Google.</translation>
 <translation id="4962975101802056554">إبطال جميع الأذونات للجهاز</translation>
 <translation id="4970824347203572753">لا تتوفر هذه الميزة في موقعك الجغرافي</translation>
 <translation id="497421865427891073">انتقال للأمام</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">تمت مشاركة النص من <ph name="DEVICE_NAME" />.</translation>
 <translation id="7762668264895820836">‏بطاقة SD <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">إضافة عنوان</translation>
-<translation id="7769602470925380267">قبول وتسجيل الخروج</translation>
 <translation id="7772032839648071052">تأكيد عبارة المرور</translation>
 <translation id="7772375229873196092">إغلاق <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{‏<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 وطريقة دفع إضافية واحدة (<ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />)}zero{‏<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 و<ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> طريقة دفع إضافية}two{‏<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 وطريقتا دفع إضافيتان (<ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />)}few{‏<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 و<ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> طرق دفع إضافية}many{‏<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 و<ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> طريقة دفع إضافية}other{‏<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 و<ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> طريقة دفع إضافية}}</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 579cb6f1..1a3b0a37 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Няма резултати</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> споделя екрана ви</translation>
 <translation id="4961107849584082341">Превод на тази страница на който и да е език</translation>
-<translation id="4961700429721424617">Излизате от профил, управляван от <ph name="MANAGED_DOMAIN" />. Данните ви в Chrome ще се изтрият от това устройство, но ще останат в профила ви в Google.</translation>
 <translation id="4962975101802056554">Отмяна на всички разрешения за устройството</translation>
 <translation id="4970824347203572753">Не се предлага за местоположението ви</translation>
 <translation id="497421865427891073">Преминаване напред</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Текст, споделен от <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">SD карта <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Добавяне на адрес</translation>
-<translation id="7769602470925380267">Приемане и излизане от профила</translation>
 <translation id="7772032839648071052">Потвърдете пропуска</translation>
 <translation id="7772375229873196092">Затваряне на <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 и още <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 и още <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}}</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 99ade817..6d9af1237 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bn.xtb
@@ -528,7 +528,6 @@
 <translation id="4943872375798546930">কোন ফলাফল নেই</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> আপনার স্ক্রিন শেয়ার করছে</translation>
 <translation id="4961107849584082341">এই পৃষ্ঠাটি যেকোনও ভাষায় অনুবাদ করুন</translation>
-<translation id="4961700429721424617"><ph name="MANAGED_DOMAIN" /> দ্বারা পরিচালিত একটি অ্যাকাউন্ট থেকে আপনি সাইন-আউট করছেন। এটা এই ডিভাইস থেকে আপনার Chrome ডেটা মুছে ফেলবে, কিন্তু আপনার Google অ্যাকাউন্টে ডেটা থেকে যাবে।</translation>
 <translation id="4962975101802056554">ডিভাইসের ক্ষেত্রে সমস্ত অনুমতি সরিয়ে দিন</translation>
 <translation id="4970824347203572753">আপনার লোকেশনে উপলভ্য নেই</translation>
 <translation id="497421865427891073">অগ্রবর্তী করুন</translation>
@@ -924,7 +923,6 @@
 <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> থেকে টেক্সট শেয়ার করা হয়েছে</translation>
 <translation id="7762668264895820836"><ph name="SD_CARD_NUMBER" /> টি এসডি কার্ড</translation>
 <translation id="7764225426217299476">ঠিকানা যোগ করুন</translation>
-<translation id="7769602470925380267">স্বীকার করে সাইন-আউট করুন</translation>
 <translation id="7772032839648071052">পাসফ্রেজ নিশ্চিত করুন</translation>
 <translation id="7772375229873196092"><ph name="APP_NAME" /> বন্ধ করুন</translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 এবং <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> আরও অনেক}one{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 এবং <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> আরও অনেক}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 এবং <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> আরও অনেক}}</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 a2a75e2..5ad652a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">No hi ha resultats</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> comparteix la teva pantalla</translation>
 <translation id="4961107849584082341">Tradueix aquesta pàgina a qualsevol idioma</translation>
-<translation id="4961700429721424617">Estàs tancant la sessió d'un compte gestionat per <ph name="MANAGED_DOMAIN" />. Se suprimiran les teves dades de Chrome en aquest dispositiu, però continuaran al teu compte de Google.</translation>
 <translation id="4962975101802056554">Revoca tots els permisos del dispositiu</translation>
 <translation id="4970824347203572753">No està disponible a la teva ubicació</translation>
 <translation id="497421865427891073">Ves endavant</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Text compartit des del dispositiu <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">Targeta SD <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Afegeix una adreça</translation>
-<translation id="7769602470925380267">Accepta i tanca la sessió</translation>
 <translation id="7772032839648071052">Confirmeu la frase de contrasenya</translation>
 <translation id="7772375229873196092">Tanca <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 i <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> més}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 i <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> més}}</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 d4b7959..3a4d331 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Žádné výsledky</translation>
 <translation id="4958708863221495346">Stránka <ph name="URL_OF_THE_CURRENT_TAB" /> sdílí vaši obrazovku</translation>
 <translation id="4961107849584082341">Nechte si tuto stránku přeložit do libovolného jazyka</translation>
-<translation id="4961700429721424617">Odhlašujete se z účtu, který je spravován doménou <ph name="MANAGED_DOMAIN" />. Touto akcí svá data prohlížeče Chrome smažete z tohoto zařízení, ve vašem účtu Google však zůstanou.</translation>
 <translation id="4962975101802056554">Zrušit všechna oprávnění pro zařízení</translation>
 <translation id="4970824347203572753">Ve vaší lokalitě není k dispozici</translation>
 <translation id="497421865427891073">Vpřed</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Text sdílený ze zařízení <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">SD karta <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Přidat adresu</translation>
-<translation id="7769602470925380267">Přijmout a odhlásit se</translation>
 <translation id="7772032839648071052">Potvrďte heslovou frázi</translation>
 <translation id="7772375229873196092">Zavřít aplikaci <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" /> a <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> další}few{<ph name="PAYMENT_METHOD_PREVIEW" /> a <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> další}many{<ph name="PAYMENT_METHOD_PREVIEW" /> a <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> další}other{<ph name="PAYMENT_METHOD_PREVIEW" /> a <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> dalších}}</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 bd61de4..0423c7c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Ingen resultater</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> deler din skærm</translation>
 <translation id="4961107849584082341">Oversæt denne side til et hvilket som helst sprog</translation>
-<translation id="4961700429721424617">Du er ved at logge ud af en konto, der administreres af <ph name="MANAGED_DOMAIN" />. Denne handling sletter dine Chrome-data fra denne enhed, men dine data forbliver på din Google-konto.</translation>
 <translation id="4962975101802056554">Tilbagekald alle tilladelser for enheden</translation>
 <translation id="4970824347203572753">Ikke tilgængelig på din placering</translation>
 <translation id="497421865427891073">Gå fremad</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Tekst, der deles fra <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">SD-kort <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Tilføj adresse</translation>
-<translation id="7769602470925380267">Acceptér, og log ud</translation>
 <translation id="7772032839648071052">Bekræft adgangssætning</translation>
 <translation id="7772375229873196092">Luk <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 og <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> mere}one{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 og <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> mere}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 og <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> mere}}</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 584533c..c583790 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Keine Ergebnisse</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> hat Ihren Bildschirm freigegeben</translation>
 <translation id="4961107849584082341">Lassen Sie sich diese Seite in eine beliebige Sprache übersetzen</translation>
-<translation id="4961700429721424617">Sie melden sich von einem Konto ab, das von <ph name="MANAGED_DOMAIN" /> verwaltet wird. Dadurch werden Ihre Chrome-Daten von diesem Gerät gelöscht, bleiben jedoch in Ihrem Google-Konto erhalten.</translation>
 <translation id="4962975101802056554">Alle Berechtigungen für Gerät entziehen</translation>
 <translation id="4970824347203572753">In Ihrem Land nicht verfügbar</translation>
 <translation id="497421865427891073">Weiter</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Text geteilt von <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">SD-Karte <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Adresse hinzufügen</translation>
-<translation id="7769602470925380267">Akzeptieren und abmelden</translation>
 <translation id="7772032839648071052">Passphrase bestätigen</translation>
 <translation id="7772375229873196092"><ph name="APP_NAME" /> schließen</translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 und <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> weitere}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 und <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> weitere}}</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 563e3f9..403d2fd 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Δεν υπάρχουν αποτελέσματα</translation>
 <translation id="4958708863221495346">Η καρτέλα <ph name="URL_OF_THE_CURRENT_TAB" /> μοιράζεται την οθόνη σας.</translation>
 <translation id="4961107849584082341">Μεταφράστε αυτήν τη σελίδα σε οποιαδήποτε γλώσσα</translation>
-<translation id="4961700429721424617">Πρόκειται να αποσυνδεθείτε από έναν λογαριασμό του οποίου η διαχείριση γίνεται από <ph name="MANAGED_DOMAIN" />. Αυτή η ενέργεια θα διαγράψει τα δεδομένα σας στο Chrome από αυτήν τη συσκευή, αλλά θα διατηρηθούν στον Λογαριασμό σας Google.</translation>
 <translation id="4962975101802056554">Ανάκληση όλων των αδειών για τη συσκευή</translation>
 <translation id="4970824347203572753">Δεν είναι διαθέσιμο στην τοποθεσία σας</translation>
 <translation id="497421865427891073">Μετάβαση προς τα εμπρός</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Το κείμενο κοινοποιήθηκε από τη συσκευή <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">Κάρτα SD <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Προσθήκη διεύθυνσης</translation>
-<translation id="7769602470925380267">Αποδοχή και αποσύνδεση</translation>
 <translation id="7772032839648071052">Επιβεβαίωση φράσης πρόσβασης</translation>
 <translation id="7772375229873196092">Κλείσιμο <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 και <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> ακόμη}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 και <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> ακόμη}}</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 9a653ce..34308f7 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
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">No results</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> is sharing your screen</translation>
 <translation id="4961107849584082341">Translate this page to any language</translation>
-<translation id="4961700429721424617">You are signing out of an account managed by <ph name="MANAGED_DOMAIN" />. This will delete your Chrome data from this device, but your data will remain in your Google Account.</translation>
 <translation id="4962975101802056554">Revoke all permissions for device</translation>
 <translation id="4970824347203572753">Not available in your location</translation>
 <translation id="497421865427891073">go forward</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Text shared from <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">SD Card <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Add address</translation>
-<translation id="7769602470925380267">Accept and sign out</translation>
 <translation id="7772032839648071052">Confirm passphrase</translation>
 <translation id="7772375229873196092">Close <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 and <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> more}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 and <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> more}}</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 f1b911ad..c5fbe1b 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
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Sin resultados</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> está compartiendo tu pantalla</translation>
 <translation id="4961107849584082341">Traducir esta página a cualquier idioma</translation>
-<translation id="4961700429721424617">Estás saliendo de una cuenta administrada por <ph name="MANAGED_DOMAIN" />. Esta acción borrará tus datos de Chrome en este dispositivo, pero permanecerán en tu cuenta de Google.</translation>
 <translation id="4962975101802056554">Revocar todos los permisos del dispositivo</translation>
 <translation id="4970824347203572753">No disponible en tu ubicación</translation>
 <translation id="497421865427891073">Avanzar</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Texto compartido de <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">Tarjeta SD <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Agregar dirección</translation>
-<translation id="7769602470925380267">Aceptar y salir</translation>
 <translation id="7772032839648071052">Confirmar frase de contraseña</translation>
 <translation id="7772375229873196092">Cerrar <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" /> y <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> más}other{<ph name="PAYMENT_METHOD_PREVIEW" /> y <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> más}}</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 f5dde00..671cbed 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Sin resultados</translation>
 <translation id="4958708863221495346">Estás compartiendo tu pantalla a través de <ph name="URL_OF_THE_CURRENT_TAB" /></translation>
 <translation id="4961107849584082341">Traduce esta página a cualquier idioma</translation>
-<translation id="4961700429721424617">Estás cerrando sesión en una cuenta gestionada por <ph name="MANAGED_DOMAIN" />. Tus datos de Chrome se eliminarán de este dispositivo, pero permanecerán en tu cuenta de Google.</translation>
 <translation id="4962975101802056554">Revocar todos los permisos de este dispositivo</translation>
 <translation id="4970824347203572753">No está disponible en tu ubicación</translation>
 <translation id="497421865427891073">Avanzar</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Texto compartido desde <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">Tarjeta SD <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Añadir dirección</translation>
-<translation id="7769602470925380267">Aceptar y cerrar sesión</translation>
 <translation id="7772032839648071052">Repite la contraseña</translation>
 <translation id="7772375229873196092">Cerrar <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 y <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> más}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 y <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> más}}</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 7d6cdbab..9f29127 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_et.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Tulemusi pole</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> jagab teie ekraani</translation>
 <translation id="4961107849584082341">Tõlkige leht mis tahes keelde</translation>
-<translation id="4961700429721424617">Logite välja kontolt, mida haldab <ph name="MANAGED_DOMAIN" />. Selle tulemusel kustutatakse seadmes olevad Chrome'i andmed, kuid need jäävad alles teie Google'i kontole.</translation>
 <translation id="4962975101802056554">Seadme puhul kõigi lubade tühistamine</translation>
 <translation id="4970824347203572753">Pole teie asukohas saadaval</translation>
 <translation id="497421865427891073">Edasiminek</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Teksti jagati seadmest <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">SD-kaart <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Lisage aadress</translation>
-<translation id="7769602470925380267">Nõustu ja logi välja</translation>
 <translation id="7772032839648071052">Kinnitage parool</translation>
 <translation id="7772375229873196092">Sule <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 ja veel <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 ja veel <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}}</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 cc681703..15a664c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">نتیجه‌ای پیدا نشد</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> درحال اشتراک‌گذاری صفحه شما است</translation>
 <translation id="4961107849584082341">ترجمه این صفحه به زبان‌های دیگر</translation>
-<translation id="4961700429721424617">‏هم‌اکنون از حسابی که توسط <ph name="MANAGED_DOMAIN" /> مدیریت می‌شود، خارج می‌شوید. با این کار داده‌های Chrome شما از این دستگاه حذف می‌شود اما همچنان در حساب Google شما باقی می‌ماند.</translation>
 <translation id="4962975101802056554">لغو همه مجوزها برای دستگاه</translation>
 <translation id="4970824347203572753">در مکان شما دردسترس نیست</translation>
 <translation id="497421865427891073">جلو رفتن</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">نوشتار هم‌رسانی‌شده از <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">‏کارت SD <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">افزودن آدرس</translation>
-<translation id="7769602470925380267">پذیرش و خروج از سیستم</translation>
 <translation id="7772032839648071052">تأیید عبارت عبور</translation>
 <translation id="7772375229873196092">بستن <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{‏<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 و <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> روش پرداخت دیگر}one{‏<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 و <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> روش پرداخت دیگر}other{‏<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 و <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> روش پرداخت دیگر}}</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 5e361a6..36c0c9f2 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Ei tuloksia</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> jakaa näyttösi.</translation>
 <translation id="4961107849584082341">Käännä sivu mille tahansa kielelle</translation>
-<translation id="4961700429721424617">Olet kirjautumassa ulos verkkotunnuksen <ph name="MANAGED_DOMAIN" /> hallinnoimalta tililtä. Chrome-tietosi poistetaan tältä laitteelta, mutta tietosi säilyvät Google-tililläsi.</translation>
 <translation id="4962975101802056554">Peru kaikki laitteen käyttöoikeudet</translation>
 <translation id="4970824347203572753">Ei käytettävissä sijainnissasi</translation>
 <translation id="497421865427891073">Siirry eteenpäin</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> jakoi tekstin</translation>
 <translation id="7762668264895820836">SD-kortti <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Lisää osoite</translation>
-<translation id="7769602470925380267">Hyväksy ja kirjaudu ulos</translation>
 <translation id="7772032839648071052">Vahvista tunnuslause</translation>
 <translation id="7772375229873196092">Sulje <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 ja <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> muu}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 ja <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> muuta}}</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 f9bc17c..3f8a4b8d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Walang mga resulta</translation>
 <translation id="4958708863221495346">Ibinabahagi ng <ph name="URL_OF_THE_CURRENT_TAB" /> ang iyong screen</translation>
 <translation id="4961107849584082341">Isalin ang page na ito sa anumang wika</translation>
-<translation id="4961700429721424617">Nagsa-sign out ka sa account na pinamamahalaan ng <ph name="MANAGED_DOMAIN" />. Ide-delete nito ang data mo sa Chrome mula sa device na ito, ngunit mananatili ang data mo sa iyong Google account.</translation>
 <translation id="4962975101802056554">Bawiin ang lahat ng pahintulot para sa device</translation>
 <translation id="4970824347203572753">Hindi available sa iyong lokasyon</translation>
 <translation id="497421865427891073">Sumulong</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Ibinahagi ang text mula sa <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">SD card <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Magdagdag ng address</translation>
-<translation id="7769602470925380267">Tanggapin at mag-sign out</translation>
 <translation id="7772032839648071052">Kumpirmahin ang passphrase</translation>
 <translation id="7772375229873196092">Isara ang <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 at <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> iba pa}one{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 at <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> iba pa}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 at <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> na iba pa}}</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 c7b968b..ad1fc31 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Aucun résultat</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> partage votre écran.</translation>
 <translation id="4961107849584082341">Traduire cette page dans n'importe quelle langue</translation>
-<translation id="4961700429721424617">Vous vous déconnectez d'un compte géré par <ph name="MANAGED_DOMAIN" />. Cette opération entraînera la suppression de vos données Chrome de cet appareil, mais celles-ci seront conservées dans votre compte Google.</translation>
 <translation id="4962975101802056554">Révoquer toutes les autorisations de l'appareil</translation>
 <translation id="4970824347203572753">Fonctionnalité non disponible dans votre pays</translation>
 <translation id="497421865427891073">Avancer</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Texte partagé par <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">Carte SD <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Ajouter une adresse</translation>
-<translation id="7769602470925380267">Accepter et se déconnecter</translation>
 <translation id="7772032839648071052">Confirmer la phrase secrète</translation>
 <translation id="7772375229873196092">Fermer <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 et <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> de plus}one{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 et <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> de plus}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 et <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> de plus}}</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 207785f..cb76f94e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_gu.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">પરિણામો નથી</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" />, તમારી સ્ક્રીન શેર કરી રહ્યું છે</translation>
 <translation id="4961107849584082341">આ પેજનો અનુવાદ કોઈપણ ભાષામાં કરો</translation>
-<translation id="4961700429721424617">તમે <ph name="MANAGED_DOMAIN" /> દ્વારા મેનેજ એકાઉન્ટમાંથી સાઇન આઉટ કરી રહ્યાં છો. આ તમારા Chrome ડેટાને આ ડિવાઇસમાંથી ડિલીટ કરશે, પરંતુ તમારો ડેટા તમારા Google એકાઉન્ટમાં રહેશે.</translation>
 <translation id="4962975101802056554">ડિવાઇસ માટેની બધી પરવાનગીઓને રદબાતલ કરો</translation>
 <translation id="4970824347203572753">તમારા સ્થાનમાં ઉપલબ્ધ નથી</translation>
 <translation id="497421865427891073">આગળ જાઓ</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882"><ph name="DEVICE_NAME" />માંથી ટેક્સ્ટ શેર કરી</translation>
 <translation id="7762668264895820836">SD કાર્ડ <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">સરનામું ઉમેરો</translation>
-<translation id="7769602470925380267">સ્વીકારો અને સાઇન આઉટ કરો</translation>
 <translation id="7772032839648071052">પાસફ્રેઝની પુષ્ટિ કરો</translation>
 <translation id="7772375229873196092"><ph name="APP_NAME" />ને બંધ કરો</translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 અને વધુ <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}one{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 અને વધુ <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 અને વધુ <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}}</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 69540819..b107539 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">कोई परिणाम नहीं</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> आपकी स्क्रीन शेयर कर रहा है</translation>
 <translation id="4961107849584082341">इस पेज का अनुवाद किसी भी भाषा में करें</translation>
-<translation id="4961700429721424617">आप <ph name="MANAGED_DOMAIN" /> से प्रबंधित खाते से साइन आउट कर रहे हैं. इससे आपका Chrome डेटा इस डिवाइस से मिट जाएगा, लेकिन आपका डेटा आपके Google खाते में बना रहेगा.</translation>
 <translation id="4962975101802056554">डिवाइस की सभी अनुमतियां निरस्त करें</translation>
 <translation id="4970824347203572753">आपके देश में उपलब्ध नहीं है</translation>
 <translation id="497421865427891073">आगे जाएं</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> से टेक्स्ट शेयर किया गया</translation>
 <translation id="7762668264895820836">SD कार्ड <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">पता जोड़ें</translation>
-<translation id="7769602470925380267">स्वीकार करें और प्रस्थान करें</translation>
 <translation id="7772032839648071052">'पासफ़्रेज' की पुष्टि करें</translation>
 <translation id="7772375229873196092"><ph name="APP_NAME" /> को बंद करें</translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 और <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> अन्य}one{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 और <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> अन्य}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 और <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> अन्य}}</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 24eee4b..ac47cc2 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Nema rezultata</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> dijeli vaš zaslon</translation>
 <translation id="4961107849584082341">Prevedite ovu stranicu na bilo koji jezik</translation>
-<translation id="4961700429721424617">Odjavljujete se s računa kojim upravlja <ph name="MANAGED_DOMAIN" />. Vaši podaci u Chromeu izbrisat će se s ovog uređaja, no ostat će na vašem Google računu.</translation>
 <translation id="4962975101802056554">Opoziv svih dopuštenja za uređaj</translation>
 <translation id="4970824347203572753">Nije dostupno na vašoj lokaciji</translation>
 <translation id="497421865427891073">Idi naprijed</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Tekst dijeljen s uređaja <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">SD kartica <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Dodaj adresu</translation>
-<translation id="7769602470925380267">Prihvati i odjavi se</translation>
 <translation id="7772032839648071052">Potvrdi zaporku</translation>
 <translation id="7772375229873196092">Zatvori aplikaciju <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 i još <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}one{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 i još <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}few{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 i još <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 i još <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}}</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 42b020f..8f5226f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Nincs találat</translation>
 <translation id="4958708863221495346">A(z) <ph name="URL_OF_THE_CURRENT_TAB" /> webhely megosztja az Ön képernyőjét</translation>
 <translation id="4961107849584082341">Bármely nyelvre lefordíthatja ezt az oldalt</translation>
-<translation id="4961700429721424617">Kijelentkezik egy <ph name="MANAGED_DOMAIN" /> által felügyelt fiókból. Ezzel törli az eszközön található Chrome-adatokat, amelyek azonban Google-fiókjában megmaradnak.</translation>
 <translation id="4962975101802056554">Az eszköz összes engedélyének visszavonása</translation>
 <translation id="4970824347203572753">Nem áll rendelkezésre az Ön tartózkodási helyén</translation>
 <translation id="497421865427891073">Előrelépés</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Szöveg megosztva a következő eszközről: <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">SD-kártya (<ph name="SD_CARD_NUMBER" />)</translation>
 <translation id="7764225426217299476">Cím hozzáadása</translation>
-<translation id="7769602470925380267">Elfogadás és kijelentkezés</translation>
 <translation id="7772032839648071052">Összetett jelszó megerősítése</translation>
 <translation id="7772375229873196092">A(z) <ph name="APP_NAME" /> bezárása</translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 és további <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 és további <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}}</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 58595e3..46498923 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Tidak ada hasil</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> berbagi layar Anda</translation>
 <translation id="4961107849584082341">Terjemahkan halaman ini ke bahasa apa pun</translation>
-<translation id="4961700429721424617">Anda akan keluar dari akun yang dikelola oleh <ph name="MANAGED_DOMAIN" />. Tindakan ini akan menghapus data Chrome dari perangkat ini, namun data tetap tersedia di Akun Google Anda.</translation>
 <translation id="4962975101802056554">Cabut semua izin untuk perangkat</translation>
 <translation id="4970824347203572753">Tidak tersedia di lokasi Anda</translation>
 <translation id="497421865427891073">Maju</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Teks dibagikan dari <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">Kartu SD <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Tambahkan alamat</translation>
-<translation id="7769602470925380267">Terima dan keluar</translation>
 <translation id="7772032839648071052">Konfirmasi frasa sandi</translation>
 <translation id="7772375229873196092">Tutup <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 dan <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> lainnya}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 dan <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> 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 96e7501..67e5c83f8 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Nessun risultato</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> sta condividendo il tuo schermo</translation>
 <translation id="4961107849584082341">Traduci questa pagina in qualsiasi lingua</translation>
-<translation id="4961700429721424617">Stai per uscire da un account gestito da <ph name="MANAGED_DOMAIN" />. I dati di Chrome verranno eliminati da questo dispositivo, ma rimarranno memorizzati nel tuo Account Google.</translation>
 <translation id="4962975101802056554">Revoca tutte le autorizzazioni per il dispositivo</translation>
 <translation id="4970824347203572753">Non disponibile nel tuo paese</translation>
 <translation id="497421865427891073">Avanti</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Testo condiviso da <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">Scheda SD <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Aggiungi indirizzo</translation>
-<translation id="7769602470925380267">Accetta ed esci</translation>
 <translation id="7772032839648071052">Conferma passphrase</translation>
 <translation id="7772375229873196092">Chiudi <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 e altri <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 e altri <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}}</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 b56e7e9..23a7e5b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">אין תוצאות</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> משתף את המסך שלך</translation>
 <translation id="4961107849584082341">אפשר לתרגם את הדף הזה לשפה כלשהי</translation>
-<translation id="4961700429721424617">‏אתה יוצא מחשבון המנוהל על-ידי <ph name="MANAGED_DOMAIN" />. פעולה זו תמחק את הנתונים שלך ב-Chrome מהמכשיר הזה, אבל הם יישארו בחשבון Google שלך.</translation>
 <translation id="4962975101802056554">ביטול כל ההרשאות בשביל המכשיר</translation>
 <translation id="4970824347203572753">האפשרות לא זמינה במיקום שלך</translation>
 <translation id="497421865427891073">המשך קדימה</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">הטקסט שותף דרך <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">‏כרטיס SD <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">הוסף כתובת</translation>
-<translation id="7769602470925380267">קבל וצא מהחשבון</translation>
 <translation id="7772032839648071052">אשר משפט-סיסמה</translation>
 <translation id="7772375229873196092">סגירת <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{‏<ph name="PAYMENT_METHOD_PREVIEW" />‎\u2026‎ ו-<ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> נוסף}two{‏<ph name="PAYMENT_METHOD_PREVIEW" />‎\u2026‎ ו-<ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> נוספים}many{‏<ph name="PAYMENT_METHOD_PREVIEW" />‎\u2026‎ ו-<ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> נוספים}other{‏<ph name="PAYMENT_METHOD_PREVIEW" />‎\u2026‎ ו-<ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> נוספים}}</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 d46fa14..98576766 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">結果はありません</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> が画面を共有しています</translation>
 <translation id="4961107849584082341">このページを任意の言語に翻訳できます</translation>
-<translation id="4961700429721424617"><ph name="MANAGED_DOMAIN" /> で管理されているアカウントからログアウトしようとしています。この操作を行うと、Chrome データはこのデバイスから削除されますが、Google アカウントには残ります。</translation>
 <translation id="4962975101802056554">デバイスのすべての権限を取り消します</translation>
 <translation id="4970824347203572753">お住まいの地域ではご利用になれません</translation>
 <translation id="497421865427891073">次に進む</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> からテキストが共有されました</translation>
 <translation id="7762668264895820836">SD カード <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">住所を追加</translation>
-<translation id="7769602470925380267">同意してログアウトする</translation>
 <translation id="7772032839648071052">パスフレーズの確認</translation>
 <translation id="7772375229873196092"><ph name="APP_NAME" /> を閉じる</translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 他 <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> 件}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 他 <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> 件}}</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 3c217a7..c24ad26 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_kn.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">ಯಾವುದೇ ಫಲಿತಾಂಶಗಳಿಲ್ಲ</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> ನಿಮ್ಮ ಪರದೆಯನ್ನು ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ</translation>
 <translation id="4961107849584082341">ಈ ಪುಟವನ್ನು ಯಾವ ಭಾಷೆಗಾದರೂ ಅನುವಾದಿಸಿ</translation>
-<translation id="4961700429721424617"><ph name="MANAGED_DOMAIN" /> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾದ ಖಾತೆಯಿಂದ ನೀವು ಸೈನ್ ಔಟ್ ಮಾಡುತ್ತಿರುವಿರಿ. ಇದು ಈ ಸಾಧನದಿಂದ ನಿಮ್ಮ Chrome ಡೇಟಾವನ್ನು ಅಳಿಸುತ್ತದೆ, ಆದರೆ ನಿಮ್ಮ ಡೇಟಾ ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿಯೇ ಇರುತ್ತದೆ.</translation>
 <translation id="4962975101802056554">ಸಾಧನಕ್ಕೆ ನೀಡಿರುವ ಎಲ್ಲಾ ಅನುಮತಿಗಳನ್ನು ಹಿಂಪಡೆಯಿರಿ</translation>
 <translation id="4970824347203572753">ನಿಮ್ಮ ಸ್ಥಳದಲ್ಲಿ ಲಭ್ಯವಿಲ್ಲ</translation>
 <translation id="497421865427891073">ಮುಂದಕ್ಕೆ ಹೋಗು</translation>
@@ -923,7 +922,6 @@
 <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> ಮೂಲಕ ಪಠ್ಯವನ್ನು ಹಂಚಲಾಗಿದೆ</translation>
 <translation id="7762668264895820836">ಎಸ್‌ಡಿ ಕಾರ್ಡ್ <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">ವಿಳಾಸ ಸೇರಿಸಿ</translation>
-<translation id="7769602470925380267">ಸಮ್ಮತಿಸಿ ಮತ್ತು ಸೈನ್ ಔಟ್ ಮಾಡಿ</translation>
 <translation id="7772032839648071052">ಪಾಸ್‌ಫ್ರೇಸ್ ಅನ್ನು ದೃಢೀಕರಿಸಿ</translation>
 <translation id="7772375229873196092"><ph name="APP_NAME" /> ಅನ್ನು ಮುಚ್ಚಿ</translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 ಮತ್ತು ಇನ್ನೂ <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}one{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 ಮತ್ತು ಇನ್ನೂ <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 ಮತ್ತು ಇನ್ನೂ <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}}</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 0f40332..229ea39 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">검색결과가 없습니다.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" />에서 내 화면을 공유하는 중입니다.</translation>
 <translation id="4961107849584082341">이 페이지를 원하는 언어로 번역하세요.</translation>
-<translation id="4961700429721424617"><ph name="MANAGED_DOMAIN" />에서 관리하는 계정에서 로그아웃합니다. 이렇게 하면 내 Chrome 데이터가 이 기기에서 삭제되지만 Google 계정에는 그대로 유지됩니다.</translation>
 <translation id="4962975101802056554">기기에서 모든 권한을 취소합니다.</translation>
 <translation id="4970824347203572753">현재 위치에서 사용할 수 없습니다.</translation>
 <translation id="497421865427891073">앞으로 이동</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882"><ph name="DEVICE_NAME" />에서 공유된 텍스트</translation>
 <translation id="7762668264895820836">SD 카드 <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">주소 추가</translation>
-<translation id="7769602470925380267">동의 및 로그아웃</translation>
 <translation id="7772032839648071052">암호 확인</translation>
 <translation id="7772375229873196092"><ph name="APP_NAME" /> 닫기</translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" /> 외 <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />개}other{<ph name="PAYMENT_METHOD_PREVIEW" /> 외 <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />개}}</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 ee2b0f6..ca2135d3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Rezultatų nėra</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> bendrina jūsų ekrano vaizdą</translation>
 <translation id="4961107849584082341">Išverskite šį puslapį į bet kokią kalbą</translation>
-<translation id="4961700429721424617">Atsijungiate nuo paskyros, kurią tvarko „<ph name="MANAGED_DOMAIN" />“. „Chrome“ duomenys bus ištrinti iš šio įrenginio, bet liks „Google“ paskyroje.</translation>
 <translation id="4962975101802056554">Anuliuoti visus įrenginio leidimus</translation>
 <translation id="4970824347203572753">Nepasiekiama jūsų vietovėje</translation>
 <translation id="497421865427891073">Eiti pirmyn</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Tekstas bendrinamas iš „<ph name="DEVICE_NAME" />“</translation>
 <translation id="7762668264895820836">SD kortelė Nr. <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Pridėti adresą</translation>
-<translation id="7769602470925380267">Sutikti ir atsijungti</translation>
 <translation id="7772032839648071052">Patvirtinti slaptafrazę</translation>
 <translation id="7772375229873196092">Uždaryti „<ph name="APP_NAME" />“</translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 ir dar <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}one{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 ir dar <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}few{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 ir dar <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}many{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 ir dar <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 ir dar <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}}</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 6374e28..e90931b3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Nav rezultātu</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> kopīgo jūsu ekrānu</translation>
 <translation id="4961107849584082341">Tulkojiet šīs lapas saturu jebkurā valodā.</translation>
-<translation id="4961700429721424617">Jūs izrakstāties no konta, kas tiek pārvaldīts domēnā <ph name="MANAGED_DOMAIN" />. Izrakstoties jūsu Chrome dati tiks dzēsti no šīs ierīces, taču tie paliks jūsu Google kontā.</translation>
 <translation id="4962975101802056554">Atsaukt visas atļaujas, kas piešķirtas ierīcei</translation>
 <translation id="4970824347203572753">Nav pieejams jūsu atrašanās vietā</translation>
 <translation id="497421865427891073">Doties uz priekšu</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Kopīgots teksts no ierīces <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">SD karte <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Pievienot adresi</translation>
-<translation id="7769602470925380267">Piekrist un izrakstīties</translation>
 <translation id="7772032839648071052">Apstipriniet ieejas frāzi</translation>
 <translation id="7772375229873196092">Aizvērt <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />… un vēl <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}zero{<ph name="PAYMENT_METHOD_PREVIEW" />… un vēl <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}one{<ph name="PAYMENT_METHOD_PREVIEW" />… un vēl <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}other{<ph name="PAYMENT_METHOD_PREVIEW" />… un vēl <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}}</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 f47c8be..cbfb018 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">ഫലങ്ങളൊന്നുമില്ല</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> നിങ്ങളുടെ സ്‌ക്രീൻ പങ്കിടുന്നു</translation>
 <translation id="4961107849584082341">ഈ പേജ് ഏത് ഭാഷയിലേക്കും വിവര്‍ത്തനം ചെയ്യുക</translation>
-<translation id="4961700429721424617"><ph name="MANAGED_DOMAIN" /> മാനേജ് ചെയ്യുന്ന അക്കൗണ്ടിൽ നിന്നും നിങ്ങൾ സൈൻ ഔട്ട് ചെയ്യുകയാണ്. ഇത് ഈ ഉപകരണത്തിൽ നിന്ന് നിങ്ങളുടെ Chrome വിവരങ്ങൾ ഇല്ലാതാക്കുമെങ്കിലും, Google അക്കൗണ്ടിൽ തുടർന്നും അവ ഉണ്ടായിരിക്കുന്നതാണ്.</translation>
 <translation id="4962975101802056554">ഉപകരണത്തിനുള്ള എല്ലാ അനുമതികളും അസാധുവാക്കുക</translation>
 <translation id="4970824347203572753">നിങ്ങളുടെ ലൊക്കേഷനിൽ ലഭ്യമല്ല</translation>
 <translation id="497421865427891073">മുന്നോട്ട് പോകുക</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> ഉപകരണത്തിൽ നിന്ന് പങ്കിട്ട ടെക്‌സ്റ്റ്</translation>
 <translation id="7762668264895820836">SD കാർഡ് <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">വിലാസം ചേർക്കുക</translation>
-<translation id="7769602470925380267">അംഗീകരിച്ചശേഷം, സൈൻ ഔട്ട് ചെയ്യുക</translation>
 <translation id="7772032839648071052">പാസ്ഫ്രേസ് സ്ഥിരീകരിക്കുക</translation>
 <translation id="7772375229873196092"><ph name="APP_NAME" /> അടയ്‌ക്കുക</translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 എന്നതും ‌മറ്റ് <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> പേയ്‌മെന്റ് രീതികളും}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 എന്നതും ‌മറ്റ് <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> പേയ്‌മെന്റ് രീതികളും}}</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 cc8335e..51a77ba 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_mr.xtb
@@ -522,7 +522,6 @@
 <translation id="4943872375798546930">परिणाम नाहीत</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> तुमची स्क्रीन शेअर करत आहे</translation>
 <translation id="4961107849584082341">या पेजचे कोणत्याही भाषेत भाषांतर करा</translation>
-<translation id="4961700429721424617"><ph name="MANAGED_DOMAIN" /> ने व्यवस्थापित केलेल्या खात्यामधून तुम्ही साइन आउट करीत आहात. हे तुमचा Chrome डेटा या डिव्हाइस वरून हटवेल परंतु तुमचा डेटा आपल्या Google खात्यामध्ये असेल.</translation>
 <translation id="4962975101802056554">डिव्हाइससाठीच्या सर्व परवानग्या रद्द करा</translation>
 <translation id="4970824347203572753">तुमच्या स्थानामध्ये उपलब्ध नाही</translation>
 <translation id="497421865427891073">पुढे जा</translation>
@@ -916,7 +915,6 @@
 <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> वरून शेअर केलेला मजकूर</translation>
 <translation id="7762668264895820836">SD कार्ड <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">पत्ता जोडा</translation>
-<translation id="7769602470925380267">स्वीकार करा आणि साइन आउट करा</translation>
 <translation id="7772032839648071052">सांकेतिक पासफ्रेझ निश्चित करा</translation>
 <translation id="7772375229873196092"><ph name="APP_NAME" /> बंद करा</translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 आणि <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> अधिक}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 आणि <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> अधिक}}</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 a0ef0c9..7fdd6202 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ms.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Tiada hasil carian</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> berkongsi skrin anda</translation>
 <translation id="4961107849584082341">Terjemahkan halaman ini ke sebarang bahasa</translation>
-<translation id="4961700429721424617">Anda log keluar daripada akaun yang diurus oleh <ph name="MANAGED_DOMAIN" />. Tindakan ini akan memadamkan data Chrome anda daripada peranti ini, tetapi data anda akan kekal dalam Akaun Google anda.</translation>
 <translation id="4962975101802056554">Batalkan semua kebenaran untuk peranti</translation>
 <translation id="4970824347203572753">Tidak tersedia di lokasi anda</translation>
 <translation id="497421865427891073">Ke hadapan</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Teks dikongsi daripada <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">Kad SD <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Tambahkan alamat</translation>
-<translation id="7769602470925380267">Terima dan log keluar</translation>
 <translation id="7772032839648071052">Sahkan frasa laluan</translation>
 <translation id="7772375229873196092">Tutup <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 dan <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> lagi}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 dan <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> lagi}}</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 5fe1bd8..15bfab3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Geen resultaten</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> heeft toegang tot je scherm</translation>
 <translation id="4961107849584082341">Vertaal deze pagina in een andere taal</translation>
-<translation id="4961700429721424617">Je logt uit van een account dat wordt beheerd door <ph name="MANAGED_DOMAIN" />. Hierdoor worden je Chrome-gegevens verwijderd van dit apparaat. Je gegevens blijven echter opgeslagen in je Google-account.</translation>
 <translation id="4962975101802056554">Alle rechten voor apparaat intrekken</translation>
 <translation id="4970824347203572753">Niet beschikbaar op jouw locatie</translation>
 <translation id="497421865427891073">Naar voren gaan</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Tekst gedeeld vanaf <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">SD-kaart <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Adres toevoegen</translation>
-<translation id="7769602470925380267">Accepteren en uitloggen</translation>
 <translation id="7772032839648071052">Bevestig de wachtwoordzin</translation>
 <translation id="7772375229873196092"><ph name="APP_NAME" /> sluiten</translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 en nog <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> andere}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 en nog <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> andere}}</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 91c92d0..108b8b8 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Ingen resultater</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> deler skjermen din</translation>
 <translation id="4961107849584082341">Oversett denne siden til hvilket som helst språk</translation>
-<translation id="4961700429721424617">Du logger av en konto som administreres av <ph name="MANAGED_DOMAIN" />. Dette fører til at Chrome-dataene dine slettes fra denne enheten. De fortsetter imidlertid å være lagret i Google-kontoen din.</translation>
 <translation id="4962975101802056554">Opphev alle tillatelser for enheten</translation>
 <translation id="4970824347203572753">Ikke tilgjengelig der du er</translation>
 <translation id="497421865427891073">Gå til neste</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Tekst delt fra <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">SD-kort <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Legg til adresse</translation>
-<translation id="7769602470925380267">Godta og logg av</translation>
 <translation id="7772032839648071052">Bekreft passord</translation>
 <translation id="7772375229873196092">Lukk <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" /> og <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> til}other{<ph name="PAYMENT_METHOD_PREVIEW" /> og <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> til}}</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 4c76fd6..431da720 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Brak wyników</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> udostępnia Twój ekran</translation>
 <translation id="4961107849584082341">Możesz przetłumaczyć tę stronę na dowolny język</translation>
-<translation id="4961700429721424617">Wylogowujesz się z konta, którym zarządza <ph name="MANAGED_DOMAIN" />. Spowoduje to usunięcie danych Chrome z tego urządzenia, ale pozostaną one na Twoim koncie Google.</translation>
 <translation id="4962975101802056554">Anuluj wszystkie uprawnienia urządzenia</translation>
 <translation id="4970824347203572753">Funkcja niedostępna w Twojej lokalizacji</translation>
 <translation id="497421865427891073">Dalej</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Tekst udostępniony z urządzenia <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">Karta SD <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Dodaj adres</translation>
-<translation id="7769602470925380267">Zaakceptuj i wyloguj się</translation>
 <translation id="7772032839648071052">Potwierdź hasło</translation>
 <translation id="7772375229873196092">Zamknij aplikację <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 i jeszcze <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}few{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 i jeszcze <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}many{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 i jeszcze <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 i jeszcze <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}}</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
index e94fa1d8..a04eb0f 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
@@ -527,7 +527,6 @@
 <translation id="4943872375798546930">Nenhum resultado</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> está compartilhando sua tela</translation>
 <translation id="4961107849584082341">Traduza esta página para qualquer idioma</translation>
-<translation id="4961700429721424617">Você está saindo de uma conta gerenciada por <ph name="MANAGED_DOMAIN" />. Os dados do Chrome serão excluídos desse dispositivo, mas permanecerão na sua Conta do Google.</translation>
 <translation id="4962975101802056554">Revogar todas as permissões para o dispositivo</translation>
 <translation id="4970824347203572753">Indisponível no seu local</translation>
 <translation id="497421865427891073">Avançar</translation>
@@ -923,7 +922,6 @@
 <translation id="7757787379047923882">Texto compartilhado por <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">Cartão SD <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Adicionar endereço</translation>
-<translation id="7769602470925380267">Aceitar e sair</translation>
 <translation id="7772032839648071052">Confirmar senha</translation>
 <translation id="7772375229873196092">Fechar <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 e mais <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}one{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 e mais <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 e mais <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}}</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 5b16361..1b6b0ee 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
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Nenhum resultado</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> está a partilhar o seu ecrã</translation>
 <translation id="4961107849584082341">Traduzir esta página para qualquer idioma</translation>
-<translation id="4961700429721424617">Está a terminar sessão numa conta gerida por <ph name="MANAGED_DOMAIN" />. Esta ação elimina os seus dados do Chrome deste dispositivo, embora permaneçam na Conta Google.</translation>
 <translation id="4962975101802056554">Revogar todas as autorizações do dispositivo</translation>
 <translation id="4970824347203572753">Não disponível na sua localização</translation>
 <translation id="497421865427891073">Avançar</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Texto partilhado a partir do dispositivo <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">Cartão SD <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Adicionar endereço</translation>
-<translation id="7769602470925380267">Aceitar e terminar sessão</translation>
 <translation id="7772032839648071052">Confirmar frase de acesso</translation>
 <translation id="7772375229873196092">Fechar <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 e mais <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 e mais <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}}</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 fc48f9c..85ade88e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Nu există rezultate</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> accesează conținutul de pe ecran</translation>
 <translation id="4961107849584082341">Tradu această pagină în orice limbă</translation>
-<translation id="4961700429721424617">Te deconectezi de la un cont gestionat de <ph name="MANAGED_DOMAIN" />. Astfel, se vor șterge datele Chrome de pe acest dispozitiv, dar datele vor rămâne în Contul Google.</translation>
 <translation id="4962975101802056554">Revocă toate permisiunile pentru dispozitiv</translation>
 <translation id="4970824347203572753">Nu este disponibil în locația ta</translation>
 <translation id="497421865427891073">Înainte</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Text trimis de pe <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">Cardul SD <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Adaugă o adresă</translation>
-<translation id="7769602470925380267">Acceptă și deconectează-te</translation>
 <translation id="7772032839648071052">Confirmă expresia de acces</translation>
 <translation id="7772375229873196092">Închide <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 și încă <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}few{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 și încă <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 și încă <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}}</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 5a69406..6b51ec5 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Нет результатов</translation>
 <translation id="4958708863221495346">Сайту <ph name="URL_OF_THE_CURRENT_TAB" /> предоставлен доступ к вашему экрану</translation>
 <translation id="4961107849584082341">Эту страницу можно перевести на любой язык</translation>
-<translation id="4961700429721424617">Вы выходите из аккаунта, которым управляет администратор домена <ph name="MANAGED_DOMAIN" />. Обратите внимание, что данные Chrome будут удалены с устройства, но сохранятся в аккаунте Google.</translation>
 <translation id="4962975101802056554">Отозвать все разрешения для устройства</translation>
 <translation id="4970824347203572753">Функция недоступна в вашей стране.</translation>
 <translation id="497421865427891073">Вперед</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Текст с устройства <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">SD-карта <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Добавить адрес</translation>
-<translation id="7769602470925380267">Принять и выйти</translation>
 <translation id="7772032839648071052">Подтвердите кодовую фразу</translation>
 <translation id="7772375229873196092">Закрыть вкладку "<ph name="APP_NAME" />"</translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" /> и ещё <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> способ оплаты}one{<ph name="PAYMENT_METHOD_PREVIEW" /> и ещё <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> способ оплаты}few{<ph name="PAYMENT_METHOD_PREVIEW" /> и ещё <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> способа оплаты}many{<ph name="PAYMENT_METHOD_PREVIEW" /> и ещё <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> способов оплаты}other{<ph name="PAYMENT_METHOD_PREVIEW" /> и ещё <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> способа оплаты}}</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 ac34691..9b64f3b1 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Žiadne výsledky</translation>
 <translation id="4958708863221495346">Web <ph name="URL_OF_THE_CURRENT_TAB" /> zdieľa vašu obrazovku</translation>
 <translation id="4961107849584082341">Preložte si túto stránku do ľubovoľného jazyka</translation>
-<translation id="4961700429721424617">Odhlasujete sa z účtu spravovaného doménou <ph name="MANAGED_DOMAIN" />. Týmto odstránite údaje Chromu z tohto zariadenia, avšak zostanú naďalej vo vašom účte Google.</translation>
 <translation id="4962975101802056554">Odvolať všetky povolenia pre zariadenie</translation>
 <translation id="4970824347203572753">Nie je k dispozícii vo vašej krajine</translation>
 <translation id="497421865427891073">Ďalej</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Text zdieľaný zo zariadenia <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">SD karta <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Pridať adresu</translation>
-<translation id="7769602470925380267">Prijať a odhlásiť</translation>
 <translation id="7772032839648071052">Potvrďte prístupovú frázu</translation>
 <translation id="7772375229873196092">Zavrieť <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 a <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> ďalší}few{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 a <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> ďalšie}many{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 a <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> ďalšieho}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 a <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> ďalších}}</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 708e7d0..56a76d7 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Ni rezultatov</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> dostopa do vašega zaslona</translation>
 <translation id="4961107849584082341">Prevedite to stran v kateri koli jezik</translation>
-<translation id="4961700429721424617">Odjavili se boste iz računa, ki ga upravlja <ph name="MANAGED_DOMAIN" />. S tem boste iz te naprave izbrisali podatke v Chromu, vendar bodo vaši podatki še vedno na voljo v Google Računu.</translation>
 <translation id="4962975101802056554">Umik vseh dovoljenj za napravo</translation>
 <translation id="4970824347203572753">Ni na voljo na vaši lokaciji</translation>
 <translation id="497421865427891073">Pojdi naprej</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Besedilo v skupni rabi iz naprave <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">Kartica SD <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Dodaj naslov</translation>
-<translation id="7769602470925380267">Sprejem in odjava</translation>
 <translation id="7772032839648071052">Potrdi geslo</translation>
 <translation id="7772375229873196092">Zapri aplikacijo <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" /> \u2026 in še <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}one{<ph name="PAYMENT_METHOD_PREVIEW" /> \u2026 in še <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}two{<ph name="PAYMENT_METHOD_PREVIEW" /> \u2026 in še <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}few{<ph name="PAYMENT_METHOD_PREVIEW" /> \u2026 in še <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}other{<ph name="PAYMENT_METHOD_PREVIEW" /> \u2026 in še <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}}</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 f4478e4..cd5c526 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Нема резултата</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> дели екран</translation>
 <translation id="4961107849584082341">Преведите ову страницу на било који језик</translation>
-<translation id="4961700429721424617">Одјављујете се са налога којим управља <ph name="MANAGED_DOMAIN" />. Тако бришете Chrome податке са овог уређаја, али ће подаци остати на Google налогу.</translation>
 <translation id="4962975101802056554">Опозовите све дозволе за уређај</translation>
 <translation id="4970824347203572753">Није доступно на вашој локацији</translation>
 <translation id="497421865427891073">Кретање унапред</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Текст дељен са уређаја <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">SD картица <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Додајте адресу</translation>
-<translation id="7769602470925380267">Прихватам, одјави ме</translation>
 <translation id="7772032839648071052">Потврди приступну фразу</translation>
 <translation id="7772375229873196092">Затвори <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 и још <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}one{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 и још <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}few{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 и још <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 и још <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}}</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 9bc8774..882a560 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Inga resultat</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> delar skärmen</translation>
 <translation id="4961107849584082341">Översätt den här sidan till vilket språk som helst</translation>
-<translation id="4961700429721424617">Du håller på att logga ut från ett konto som hanteras av <ph name="MANAGED_DOMAIN" />. Åtgärden raderar din data i Chrome från den här enheten, men den finns kvar i Google-kontot.</translation>
 <translation id="4962975101802056554">Återkalla alla behörigheter för enheten</translation>
 <translation id="4970824347203572753">Inte tillgängligt i ditt land</translation>
 <translation id="497421865427891073">Fortsätt</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Texten delades från <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">SD-kort <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Lägg till adress</translation>
-<translation id="7769602470925380267">Godkänn och logga ut</translation>
 <translation id="7772032839648071052">Bekräfta lösenfras</translation>
 <translation id="7772375229873196092">Stäng <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 och <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> till}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 och <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> till}}</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 19f3cc8..58da2e8 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Hakuna matokeo yoyote yaliyopatikana</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> inashiriki skrini yako</translation>
 <translation id="4961107849584082341">Tafsiri ukurasa huu katika lugha yoyote</translation>
-<translation id="4961700429721424617">Unaondoka kwenye akaunti inayodhibitiwa na <ph name="MANAGED_DOMAIN" />. Hatua hii itafuta data yako ya Chrome kwenye kifaa hiki, lakini data yako itasalia katika akaunti yako ya Google.</translation>
 <translation id="4962975101802056554">Batilisha ruhusa zote za kifaa</translation>
 <translation id="4970824347203572753">Hakipatikani mahali ulipo</translation>
 <translation id="497421865427891073">Nenda mbele</translation>
@@ -920,7 +919,6 @@
 <translation id="7757787379047923882">Maandishi yameshirikiwa kutoka <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">Kadi ya SD ya <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Ongeza anwani</translation>
-<translation id="7769602470925380267">Kubali na uondoke kwenye akaunti</translation>
 <translation id="7772032839648071052">Thibitisha kaulisiri</translation>
 <translation id="7772375229873196092">Funga <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 na <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> zaidi}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 na <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> zaidi}}</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 be799c9..52d9447 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">முடிவுகள் இல்லை</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> உங்கள் திரையைப் பகிர்கிறது</translation>
 <translation id="4961107849584082341">இந்தப் பக்கத்தை எந்தவொரு மொழியிலும் மொழிபெயர்க்கலாம்</translation>
-<translation id="4961700429721424617"><ph name="MANAGED_DOMAIN" /> நிர்வகிக்கும் கணக்கிலிருந்து வெளியேறுகிறீர்கள். இவ்வாறு செய்வதால், இந்தச் சாதனத்திலிருந்து Chrome தரவு நீக்கப்படும், எனினும் உங்கள் Google கணக்கில் தரவு தொடர்ந்து இருக்கும்.</translation>
 <translation id="4962975101802056554">சாதனத்திற்கான அனைத்து அனுமதிகளையும் ரத்துசெய்யும்</translation>
 <translation id="4970824347203572753">உங்கள் நாட்டில் இல்லை</translation>
 <translation id="497421865427891073">முன் செல்க</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">உரை <ph name="DEVICE_NAME" /> இலிருந்து பகிரப்பட்டுள்ளது</translation>
 <translation id="7762668264895820836">SD கார்டு <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">முகவரியைச் சேர்</translation>
-<translation id="7769602470925380267">சரி, வெளியேறு</translation>
 <translation id="7772032839648071052">கடவுச்சொற்றொடரை உறுதி செய்க</translation>
 <translation id="7772375229873196092"><ph name="APP_NAME" />ஐ மூடு</translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 மற்றும் <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> கட்டண முறை}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 மற்றும் <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> கட்டண முறைகள்}}</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 2110c64..dc34b85e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
@@ -522,7 +522,6 @@
 <translation id="4943872375798546930">ఫలితాలు ఏవీ లేవు</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> మీ స్క్రీన్‌ని భాగస్వామ్యం చేస్తోంది</translation>
 <translation id="4961107849584082341">ఈ పేజీని ఏ భాషలోకైనా అనువదించుకోవచ్చు</translation>
-<translation id="4961700429721424617">మీరు <ph name="MANAGED_DOMAIN" /> నిర్వహణలో ఉన్న ఖాతా నుండి సైన్ అవుట్ చేస్తున్నారు. దీని వ‌ల్ల మీ Chrome డేటా ఈ పరికరం నుండి తొలగించబడుతుంది. కానీ మీ డేటా మీ Google ఖాతాలో అలాగే ఉంటుంది.</translation>
 <translation id="4962975101802056554">పరికరానికి అన్ని అనుమతులను ఉపసంహరించు</translation>
 <translation id="4970824347203572753">మీ స్థానంలో అందుబాటులో లేదు</translation>
 <translation id="497421865427891073">ముందుకు వెళ్ళు</translation>
@@ -916,7 +915,6 @@
 <translation id="7757787379047923882"><ph name="DEVICE_NAME" /> నుండి షేర్ చేయబడిన వచనం</translation>
 <translation id="7762668264895820836">SD కార్డ్ <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">చిరునామాను జోడించు</translation>
-<translation id="7769602470925380267">అంగీకరిస్తున్నాను, సైన్ అవుట్ చేయి</translation>
 <translation id="7772032839648071052">రహస్య పదబంధాన్ని నిర్ధారించండి</translation>
 <translation id="7772375229873196092"><ph name="APP_NAME" />ను మూసివేయి</translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 మరియు మరో <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 మరియు మరో <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}}</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
index 6ea27d7d..a4a7e5799 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">ไม่มีผลการค้นหา</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> กำลังแชร์หน้าจอของคุณ</translation>
 <translation id="4961107849584082341">แปลหน้านี้เป็นภาษาใดก็ได้</translation>
-<translation id="4961700429721424617">คุณกำลังออกจากระบบบัญชีที่จัดการโดย <ph name="MANAGED_DOMAIN" /> การออกจากระบบจะลบข้อมูล Chrome ออกจากอุปกรณ์เครื่องนี้ แต่ข้อมูลจะยังคงอยู่ในบัญชี Google</translation>
 <translation id="4962975101802056554">เพิกถอนสิทธิ์ทั้งหมดสำหรับอุปกรณ์</translation>
 <translation id="4970824347203572753">ไม่พร้อมใช้งานในประเทศของคุณ</translation>
 <translation id="497421865427891073">ไปข้างหน้า</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">ข้อความที่แชร์จาก <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">การ์ด SD <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">เพิ่มที่อยู่</translation>
-<translation id="7769602470925380267">ยอมรับและออกจากระบบ</translation>
 <translation id="7772032839648071052">ยืนยันข้อความรหัสผ่าน</translation>
 <translation id="7772375229873196092">ปิด <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 และอีก <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> วิธี}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 และอีก <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> วิธี}}</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 9c1d6a1..11eaa68 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Sonuç yok</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> ekranınızı paylaşıyor</translation>
 <translation id="4961107849584082341">Bu sayfayı istediğiniz dile çevirin</translation>
-<translation id="4961700429721424617"><ph name="MANAGED_DOMAIN" /> tarafından yönetilen bir hesabın oturumunu kapatıyorsunuz. Bu işlemle Chrome verileriniz bu cihazdan silinir, ancak Google Hesabınızda kalmaya devam eder.</translation>
 <translation id="4962975101802056554">Cihaz için tüm izinleri iptal eder</translation>
 <translation id="4970824347203572753">Bulunduğunuz konumda kullanılamıyor</translation>
 <translation id="497421865427891073">İlerle</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Metin, <ph name="DEVICE_NAME" /> cihazından paylaşıldı</translation>
 <translation id="7762668264895820836">SD Kart <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Adres ekle</translation>
-<translation id="7769602470925380267">Kabul et ve oturumu kapat</translation>
 <translation id="7772032839648071052">Parolayı onayla</translation>
 <translation id="7772375229873196092"><ph name="APP_NAME" /> penceresini kapat</translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 ve <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> ödeme yöntemi daha}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 ve <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> ödeme yöntemi daha}}</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 1996910..e0ff5b653 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Не знайдено жодного результату</translation>
 <translation id="4958708863221495346">Сторінка <ph name="URL_OF_THE_CURRENT_TAB" /> показує ваш екран</translation>
 <translation id="4961107849584082341">Перекладіть цю сторінку будь-якою мовою</translation>
-<translation id="4961700429721424617">Ви виходите з облікового запису, зареєстрованого в домені <ph name="MANAGED_DOMAIN" />. Дані Chrome буде видалено з цього пристрою, але вони залишаться у вашому обліковому записі Google.</translation>
 <translation id="4962975101802056554">Скасувати всі дозволи для пристрою</translation>
 <translation id="4970824347203572753">Функція недоступна у вашій країні</translation>
 <translation id="497421865427891073">Перейти вперед</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Текст, надісланий із пристрою <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">Карта SD <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Додати адресу</translation>
-<translation id="7769602470925380267">Прийняти та вийти</translation>
 <translation id="7772032839648071052">Підтвердити парольну фразу</translation>
 <translation id="7772375229873196092">Закрити додаток <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 і ще <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}one{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 і ще <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}few{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 і ще <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}many{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 і ще <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 і ще <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" />}}</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 6298eba..d76b20d9 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">Không tìm thấy kết quả nào</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> đang chia sẻ màn hình của bạn</translation>
 <translation id="4961107849584082341">Dịch trang này sang ngôn ngữ bất kỳ</translation>
-<translation id="4961700429721424617">Bạn đang đăng xuất khỏi tài khoản do <ph name="MANAGED_DOMAIN" /> quản lý. Thao tác này sẽ xóa dữ liệu Chrome khỏi thiết bị này nhưng dữ liệu sẽ vẫn còn trong Tài khoản Google của bạn.</translation>
 <translation id="4962975101802056554">Thu hồi tất cả các quyền đối với thiết bị</translation>
 <translation id="4970824347203572753">Hiện chưa có ở vị trí của bạn</translation>
 <translation id="497421865427891073">Đi về phía trước</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">Văn bản được chia sẻ từ <ph name="DEVICE_NAME" /></translation>
 <translation id="7762668264895820836">Thẻ SD <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">Thêm địa chỉ</translation>
-<translation id="7769602470925380267">Chấp nhận và đăng xuất</translation>
 <translation id="7772032839648071052">Xác nhận cụm mật khẩu</translation>
 <translation id="7772375229873196092">Đóng <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 và <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> tùy chọn khác}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 và <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> tùy chọn khác}}</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 cb8d17e..069b2fb8 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
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">找不到结果</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> 正在共享您的屏幕</translation>
 <translation id="4961107849584082341">将此页面翻译成任何语言</translation>
-<translation id="4961700429721424617">您正要退出由 <ph name="MANAGED_DOMAIN" /> 管理的帐号。退出后,您的 Chrome 数据将从这台设备上删除,但仍会保留在您的 Google 帐号中。</translation>
 <translation id="4962975101802056554">撤消设备的所有权限</translation>
 <translation id="4970824347203572753">无法在您所在的国家/地区使用</translation>
 <translation id="497421865427891073">前进</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">分享自“<ph name="DEVICE_NAME" />”的文字</translation>
 <translation id="7762668264895820836">SD 卡 <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">添加地址</translation>
-<translation id="7769602470925380267">接受并退出</translation>
 <translation id="7772032839648071052">确认密码</translation>
 <translation id="7772375229873196092">关闭<ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026以及另外 <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> 种付款方式}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026以及另外 <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> 种付款方式}}</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 d6edc4d..49b10125 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
@@ -526,7 +526,6 @@
 <translation id="4943872375798546930">沒有結果</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> 正在共用你的畫面。</translation>
 <translation id="4961107849584082341">將這個網頁翻譯成任何語言</translation>
-<translation id="4961700429721424617">您即將登出由 <ph name="MANAGED_DOMAIN" /> 所管理的帳戶。系統會將您的 Chrome 資料從這個裝置上刪除,但繼續保留在您的 Google 帳戶中。</translation>
 <translation id="4962975101802056554">撤銷裝置的所有權限</translation>
 <translation id="4970824347203572753">你所在的地區無法使用這項功能</translation>
 <translation id="497421865427891073">往前</translation>
@@ -922,7 +921,6 @@
 <translation id="7757787379047923882">透過「<ph name="DEVICE_NAME" />」分享的文字</translation>
 <translation id="7762668264895820836">SD 卡 <ph name="SD_CARD_NUMBER" /></translation>
 <translation id="7764225426217299476">新增地址</translation>
-<translation id="7769602470925380267">接受並登出</translation>
 <translation id="7772032839648071052">確認通關密語</translation>
 <translation id="7772375229873196092">關閉 <ph name="APP_NAME" /></translation>
 <translation id="7774809984919390718">{PAYMENT_METHOD,plural, =1{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 和另外 <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> 種付款方式}other{<ph name="PAYMENT_METHOD_PREVIEW" />\u2026 和另外 <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> 種付款方式}}</translation>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/printing/PrintingControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/printing/PrintingControllerTest.java
index a81a949..69decf9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/printing/PrintingControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/printing/PrintingControllerTest.java
@@ -23,7 +23,6 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
@@ -165,7 +164,7 @@
     @LargeTest
     @Feature({"Printing"})
     public void testNormalPrintingFlow() throws Throwable {
-        if (!ApiCompatibilityUtils.isPrintingSupported()) return;
+        if (!(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)) return;
 
         mActivityTestRule.startMainActivityWithURL(URL);
         final Tab currentTab = mActivityTestRule.getActivity().getActivityTab();
@@ -234,7 +233,7 @@
     @MediumTest
     @Feature({"Printing"})
     public void testPrintCloseWindowBeforeStart() throws Throwable {
-        if (!ApiCompatibilityUtils.isPrintingSupported()) return;
+        if (!(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)) return;
 
         mActivityTestRule.startMainActivityWithURL(URL);
         final Tab currentTab = mActivityTestRule.getActivity().getActivityTab();
@@ -262,7 +261,7 @@
     @LargeTest
     @Feature({"Printing"})
     public void testPrintCloseWindowBeforeOnWrite() throws Throwable {
-        if (!ApiCompatibilityUtils.isPrintingSupported()) return;
+        if (!(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)) return;
 
         mActivityTestRule.startMainActivityWithURL(URL);
         final Tab currentTab = mActivityTestRule.getActivity().getActivityTab();
@@ -329,7 +328,7 @@
     @MediumTest
     @Feature({"Printing"})
     public void testCancelPrintBeforeWriteResultCallbacks() throws Throwable {
-        if (!ApiCompatibilityUtils.isPrintingSupported()) return;
+        if (!(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)) return;
 
         mActivityTestRule.startMainActivityWithURL(URL);
 
@@ -388,7 +387,7 @@
     @SmallTest
     @Feature({"Printing"})
     public void testPdfWritingDoneCalledWithoutInitailizePrintingTask() throws Throwable {
-        if (!ApiCompatibilityUtils.isPrintingSupported()) return;
+        if (!(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)) return;
 
         mActivityTestRule.startMainActivityWithURL(URL);
         final PrintingControllerImpl controller = createControllerOnUiThread();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/OWNERS
new file mode 100644
index 0000000..f9bba70b
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/OWNERS
@@ -0,0 +1 @@
+file://chrome/android/java/src/org/chromium/chrome/browser/status_indicator/OWNERS
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorTest.java
new file mode 100644
index 0000000..f8f3519
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorTest.java
@@ -0,0 +1,95 @@
+// 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.status_indicator;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.MediumTest;
+import android.view.View;
+import android.view.ViewGroup;
+
+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.test.util.CommandLineFlags;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.ChromeFeatureList;
+import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.tabbed_mode.TabbedRootUiCoordinator;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
+import org.chromium.chrome.test.util.browser.Features;
+import org.chromium.content_public.browser.test.util.TestThreadUtils;
+
+/**
+ * Integration tests for status indicator covering related code in
+ * {@link StatusIndicatorCoordinator} and {@link TabbedRootUiCoordinator}.
+ */
+// clang-format off
+@RunWith(ChromeJUnit4ClassRunner.class)
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@Features.EnableFeatures({ChromeFeatureList.OFFLINE_INDICATOR_V2})
+public class StatusIndicatorTest {
+    // clang-format on
+    @Rule
+    public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
+
+    private StatusIndicatorCoordinator mStatusIndicatorCoordinator;
+    private StatusIndicatorSceneLayer mStatusIndicatorSceneLayer;
+    private View mStatusIndicatorContainer;
+    private ViewGroup.MarginLayoutParams mControlContainerLayoutParams;
+
+    @Before
+    public void setUp() throws InterruptedException {
+        mActivityTestRule.startMainActivityOnBlankPage();
+
+        mStatusIndicatorCoordinator = ((TabbedRootUiCoordinator) mActivityTestRule.getActivity()
+                                               .getRootUiCoordinatorForTesting())
+                                              .getStatusIndicatorCoordinatorForTesting();
+        mStatusIndicatorSceneLayer = mStatusIndicatorCoordinator.getSceneLayer();
+        mStatusIndicatorContainer =
+                mActivityTestRule.getActivity().findViewById(R.id.status_indicator);
+        final View controlContainer =
+                mActivityTestRule.getActivity().findViewById(R.id.control_container);
+        mControlContainerLayoutParams =
+                (ViewGroup.MarginLayoutParams) controlContainer.getLayoutParams();
+    }
+
+    @Test
+    @MediumTest
+    public void testShowAndHide() {
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+
+        assertThat("Wrong initial Android view visibility.",
+                mStatusIndicatorContainer.getVisibility(), equalTo(View.GONE));
+        Assert.assertFalse("Wrong initial composited view visibility.",
+                mStatusIndicatorSceneLayer.isSceneOverlayTreeShowing());
+        assertThat("Wrong initial control container top margin.",
+                mControlContainerLayoutParams.topMargin, equalTo(0));
+
+        TestThreadUtils.runOnUiThreadBlocking(mStatusIndicatorCoordinator::show);
+
+        assertThat("Android view is not visible.", mStatusIndicatorContainer.getVisibility(),
+                equalTo(View.VISIBLE));
+        Assert.assertTrue("Composited view is not visible.",
+                mStatusIndicatorSceneLayer.isSceneOverlayTreeShowing());
+        assertThat("Wrong control container top margin.", mControlContainerLayoutParams.topMargin,
+                equalTo(mStatusIndicatorContainer.getHeight()));
+
+        TestThreadUtils.runOnUiThreadBlocking(mStatusIndicatorCoordinator::hide);
+
+        assertThat("Android view is not gone.", mStatusIndicatorContainer.getVisibility(),
+                equalTo(View.GONE));
+        Assert.assertFalse("Composited view is visible.",
+                mStatusIndicatorSceneLayer.isSceneOverlayTreeShowing());
+        assertThat("Wrong control container top margin.", mControlContainerLayoutParams.topMargin,
+                equalTo(0));
+    }
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorViewBinderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorViewBinderTest.java
new file mode 100644
index 0000000..82ad13a
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorViewBinderTest.java
@@ -0,0 +1,154 @@
+// 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.status_indicator;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import android.graphics.drawable.Drawable;
+import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.SmallTest;
+import android.support.v4.content.res.ResourcesCompat;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.TextView;
+
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.widget.ViewResourceFrameLayout;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.ui.DummyUiActivity;
+import org.chromium.chrome.test.ui.DummyUiActivityTestCase;
+import org.chromium.content_public.browser.test.util.TestThreadUtils;
+import org.chromium.ui.modelutil.PropertyModel;
+import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
+
+/**
+ * Tests for {@link StatusIndicatorViewBinder}.
+ */
+@RunWith(ChromeJUnit4ClassRunner.class)
+public class StatusIndicatorViewBinderTest extends DummyUiActivityTestCase {
+    private static final String STATUS_TEXT = "Offline";
+
+    private ViewResourceFrameLayout mContainer;
+    private TextView mStatusTextView;
+    private MockStatusIndicatorSceneLayer mSceneLayer;
+
+    private PropertyModel mModel;
+    private PropertyModelChangeProcessor mMCP;
+
+    @BeforeClass
+    public static void setUpBeforeActivityLaunched() {
+        DummyUiActivity.setTestLayout(R.layout.status_indicator_container);
+    }
+
+    @Override
+    public void setUpTest() throws Exception {
+        super.setUpTest();
+
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            mContainer = getActivity().findViewById(R.id.status_indicator);
+            mStatusTextView = mContainer.findViewById(R.id.status_text);
+        });
+        mSceneLayer = new MockStatusIndicatorSceneLayer(mContainer);
+        mModel = new PropertyModel.Builder(StatusIndicatorProperties.ALL_KEYS)
+                         .with(StatusIndicatorProperties.STATUS_TEXT, "")
+                         .with(StatusIndicatorProperties.STATUS_ICON, null)
+                         .with(StatusIndicatorProperties.ANDROID_VIEW_VISIBLE, false)
+                         .with(StatusIndicatorProperties.COMPOSITED_VIEW_VISIBLE, false)
+                         .build();
+        mMCP = PropertyModelChangeProcessor.create(mModel,
+                new StatusIndicatorViewBinder.ViewHolder(mContainer, mSceneLayer),
+                StatusIndicatorViewBinder::bind);
+    }
+
+    @Override
+    public void tearDownTest() throws Exception {
+        mMCP.destroy();
+        super.tearDownTest();
+    }
+
+    @Test
+    @SmallTest
+    @UiThreadTest
+    public void testTextView() {
+        Assert.assertTrue(
+                "Wrong initial status text.", TextUtils.isEmpty(mStatusTextView.getText()));
+        Assert.assertNull(
+                "Wrong initial status icon.", mStatusTextView.getCompoundDrawablesRelative()[0]);
+        Assert.assertTrue(
+                "Rest of the compound drawables are not null.", areRestOfCompoundDrawablesNull());
+
+        Drawable drawable = ResourcesCompat.getDrawable(getActivity().getResources(),
+                R.drawable.ic_error_white_24dp_filled, getActivity().getTheme());
+
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            mModel.set(StatusIndicatorProperties.STATUS_TEXT, STATUS_TEXT);
+            mModel.set(StatusIndicatorProperties.STATUS_ICON, drawable);
+        });
+
+        assertThat("Wrong status text.", mStatusTextView.getText(), equalTo(STATUS_TEXT));
+        assertThat("Wrong status icon.", mStatusTextView.getCompoundDrawablesRelative()[0],
+                equalTo(drawable));
+        Assert.assertTrue(
+                "Rest of the compound drawables are not null.", areRestOfCompoundDrawablesNull());
+    }
+
+    @Test
+    @SmallTest
+    @UiThreadTest
+    public void testVisibility() {
+        assertThat("Wrong initial Android view visibility.", mContainer.getVisibility(),
+                equalTo(View.GONE));
+        Assert.assertFalse("Wrong initial composited view visibility.",
+                mSceneLayer.isSceneOverlayTreeShowing());
+
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            mModel.set(StatusIndicatorProperties.ANDROID_VIEW_VISIBLE, true);
+            mModel.set(StatusIndicatorProperties.COMPOSITED_VIEW_VISIBLE, true);
+        });
+
+        assertThat(
+                "Android view is not visible.", mContainer.getVisibility(), equalTo(View.VISIBLE));
+        Assert.assertTrue(
+                "Composited view is not visible.", mSceneLayer.isSceneOverlayTreeShowing());
+
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            mModel.set(StatusIndicatorProperties.ANDROID_VIEW_VISIBLE, false);
+            mModel.set(StatusIndicatorProperties.COMPOSITED_VIEW_VISIBLE, false);
+        });
+
+        assertThat("Android view is not gone.", mContainer.getVisibility(), equalTo(View.GONE));
+        Assert.assertFalse("Composited view is visible.", mSceneLayer.isSceneOverlayTreeShowing());
+    }
+
+    private boolean areRestOfCompoundDrawablesNull() {
+        final Drawable[] drawables = mStatusTextView.getCompoundDrawablesRelative();
+        for (int i = 1; i < drawables.length; i++) {
+            if (drawables[i] != null) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /** Mock {@link StatusIndicatorSceneLayer} class to avoid native initialization. */
+    private class MockStatusIndicatorSceneLayer extends StatusIndicatorSceneLayer {
+        MockStatusIndicatorSceneLayer(ViewResourceFrameLayout statusIndicator) {
+            super(statusIndicator);
+        }
+
+        @Override
+        protected void initializeNative() {}
+
+        @Override
+        public void destroy() {}
+    }
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetControllerTest.java
index 5fec396..7ff170d5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetControllerTest.java
@@ -56,6 +56,8 @@
     private BottomSheetController mSheetController;
     private TestBottomSheetContent mLowPriorityContent;
     private TestBottomSheetContent mHighPriorityContent;
+    private TestBottomSheetContent mPeekableContent;
+    private TestBottomSheetContent mNonPeekableContent;
 
     @Before
     public void setUp() throws Exception {
@@ -82,6 +84,10 @@
                     mActivityTestRule.getActivity(), ContentPriority.LOW, false);
             mHighPriorityContent = new TestBottomSheetContent(
                     mActivityTestRule.getActivity(), ContentPriority.HIGH, false);
+
+            mPeekableContent = new TestBottomSheetContent(mActivityTestRule.getActivity(), true);
+            mNonPeekableContent =
+                    new TestBottomSheetContent(mActivityTestRule.getActivity(), false);
         });
     }
 
@@ -129,6 +135,42 @@
     @Test
     @MediumTest
     @Feature({"BottomSheetController"})
+    public void testHandleBackPressPeekable() throws InterruptedException, TimeoutException {
+        int expectedState = mBottomSheet.isSmallScreen() ? BottomSheet.SheetState.FULL
+                                                         : BottomSheet.SheetState.HALF;
+        requestContentInSheet(mPeekableContent, true);
+        expandSheet();
+        assertEquals("The bottom sheet should be expanded.", expectedState,
+                mBottomSheet.getSheetState());
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mBottomSheet.handleBackPress();
+            mBottomSheet.endAnimations();
+        });
+        assertEquals("The bottom sheet should be peeking.", BottomSheet.SheetState.PEEK,
+                mBottomSheet.getSheetState());
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"BottomSheetController"})
+    public void testHandleBackPressNonPeekable() throws InterruptedException, TimeoutException {
+        int expectedState = mBottomSheet.isSmallScreen() ? BottomSheet.SheetState.FULL
+                                                         : BottomSheet.SheetState.HALF;
+        requestContentInSheet(mNonPeekableContent, true);
+        expandSheet();
+        assertEquals("The bottom sheet should be expanded.", expectedState,
+                mBottomSheet.getSheetState());
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            mBottomSheet.handleBackPress();
+            mBottomSheet.endAnimations();
+        });
+        assertEquals("The bottom sheet should be hidden.", BottomSheet.SheetState.HIDDEN,
+                mBottomSheet.getSheetState());
+    }
+
+    @Test
+    @MediumTest
+    @Feature({"BottomSheetController"})
     public void testSheetPeekAfterTabSwitcher() throws InterruptedException, TimeoutException {
         requestContentInSheet(mLowPriorityContent, true);
         enterAndExitTabSwitcher();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/TestBottomSheetContent.java b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/TestBottomSheetContent.java
index 6bdd4f0f..1baecf9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/TestBottomSheetContent.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/TestBottomSheetContent.java
@@ -30,15 +30,20 @@
     /** Whether this content is browser specific. */
     private boolean mHasCustomLifecycle;
 
+    /** Whether this content's peek state is enabled. */
+    private boolean mPeekStateEnabled;
+
     /**
      * @param context A context to inflate views with.
      * @param priority The content's priority.
      * @param hasCustomLifecycle Whether the content is browser specific.
+     * @param peekStateEnabled Whether the content's peek state is enabled.
      */
-    public TestBottomSheetContent(
-            Context context, @ContentPriority int priority, boolean hasCustomLifecycle) {
+    public TestBottomSheetContent(Context context, @ContentPriority int priority,
+            boolean hasCustomLifecycle, boolean peekStateEnabled) {
         mPriority = priority;
         mHasCustomLifecycle = hasCustomLifecycle;
+        mPeekStateEnabled = peekStateEnabled;
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             mToolbarView = new View(context);
             ViewGroup.LayoutParams params =
@@ -54,6 +59,24 @@
         });
     }
 
+    /**
+     * @param context A context to inflate views with.
+     * @param priority The content's priority.
+     * @param hasCustomLifecycle Whether the content is browser specific.
+     */
+    public TestBottomSheetContent(
+            Context context, @ContentPriority int priority, boolean hasCustomLifecycle) {
+        this(context, priority, hasCustomLifecycle, true);
+    }
+
+    /**
+     * @param context A context to inflate views with.
+     * @param peekStateEnabled Whether the content's peek state is enabled.
+     */
+    public TestBottomSheetContent(Context context, boolean peekStateEnabled) {
+        this(/*TestBottomSheetContent(*/ context, ContentPriority.LOW, false, peekStateEnabled);
+    }
+
     @Override
     public View getContentView() {
         return mContentView;
@@ -85,7 +108,7 @@
 
     @Override
     public boolean isPeekStateEnabled() {
-        return true;
+        return mPeekStateEnabled;
     }
 
     @Override
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationActionsUpdatedTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationActionsUpdatedTest.java
index 47ef65b..09a9bc6 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationActionsUpdatedTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationActionsUpdatedTest.java
@@ -51,7 +51,7 @@
         doCallRealMethod()
                 .when(mMockForegroundServiceUtils)
                 .startForegroundService(any(Intent.class));
-        mTabHolder = new MediaNotificationTestTabHolder(TAB_ID_1, "about:blank", "title1");
+        mTabHolder = createMediaNotificationTestTabHolder(TAB_ID_1, "about:blank", "title1");
     }
 
     @Test
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationFaviconTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationFaviconTest.java
index 98210ef..ce1f1a9 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationFaviconTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationFaviconTest.java
@@ -79,7 +79,7 @@
         doCallRealMethod()
                 .when(mMockForegroundServiceUtils)
                 .startForegroundService(any(Intent.class));
-        mTabHolder = new MediaNotificationTestTabHolder(TAB_ID_1, "about:blank", "title1");
+        mTabHolder = createMediaNotificationTestTabHolder(TAB_ID_1, "about:blank", "title1");
     }
 
     @Override
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerTestBase.java b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerTestBase.java
index 5f3b5c12..704ed2c 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerTestBase.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerTestBase.java
@@ -25,6 +25,7 @@
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 import org.robolectric.RuntimeEnvironment;
@@ -32,6 +33,7 @@
 import org.robolectric.shadows.ShadowLooper;
 
 import org.chromium.base.ContextUtils;
+import org.chromium.base.test.util.JniMocker;
 import org.chromium.chrome.browser.AppHooks;
 import org.chromium.chrome.browser.media.ui.MediaNotificationManager.ListenerService;
 import org.chromium.chrome.browser.notifications.ForegroundServiceUtils;
@@ -54,6 +56,14 @@
 
     MediaNotificationInfo.Builder mMediaNotificationInfoBuilder;
 
+    @Rule
+    public JniMocker mocker = new JniMocker();
+
+    protected MediaNotificationTestTabHolder createMediaNotificationTestTabHolder(
+            int tabId, String url, String title) {
+        return new MediaNotificationTestTabHolder(tabId, url, title, mocker);
+    }
+
     static class MockMediaNotificationManager extends MediaNotificationManager {
         public MockMediaNotificationManager(NotificationUmaTracker umaTracker, int notificationId) {
             super(umaTracker, notificationId);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationTestTabHolder.java b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationTestTabHolder.java
index 48b168c..0c11aed 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationTestTabHolder.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationTestTabHolder.java
@@ -4,17 +4,19 @@
 
 package org.chromium.chrome.browser.media.ui;
 
+import static org.mockito.ArgumentMatchers.argThat;
 import static org.mockito.Mockito.when;
 
 import android.graphics.Bitmap;
 
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
 
+import org.chromium.base.test.util.JniMocker;
 import org.chromium.chrome.browser.favicon.LargeIconBridge;
 import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.components.url_formatter.UrlFormatter;
+import org.chromium.components.url_formatter.UrlFormatterJni;
 import org.chromium.content_public.browser.MediaSession;
 import org.chromium.content_public.browser.NavigationHandle;
 import org.chromium.content_public.browser.WebContents;
@@ -27,6 +29,8 @@
  */
 public class MediaNotificationTestTabHolder {
     @Mock
+    UrlFormatter.Natives mUrlFormatterJniMock;
+    @Mock
     WebContents mWebContents;
     @Mock
     MediaSession mMediaSession;
@@ -47,24 +51,20 @@
         }
     }
 
-    public MediaNotificationTestTabHolder(int tabId, String url, String title) {
+    public MediaNotificationTestTabHolder(int tabId, String url, String title, JniMocker mocker) {
         MockitoAnnotations.initMocks(this);
+        mocker.mock(UrlFormatterJni.TEST_HOOKS, mUrlFormatterJniMock);
+        // We don't want this matcher to match the current value of mUrl. Wrapping it in a matcher
+        // allows us to match on the updated value of mUrl.
+        when(mUrlFormatterJniMock.formatUrlForSecurityDisplay(
+                     argThat(urlArg -> urlArg.equals(mUrl))))
+                .thenAnswer(invocation -> mUrl);
 
         when(mTab.getWebContents()).thenReturn(mWebContents);
         when(mTab.getId()).thenReturn(tabId);
         when(mTab.isIncognito()).thenReturn(false);
-        when(mTab.getTitle()).thenAnswer(new Answer<String>() {
-            @Override
-            public String answer(InvocationOnMock invocation) {
-                return mTitle;
-            }
-        });
-        when(mTab.getUrl()).thenAnswer(new Answer<String>() {
-            @Override
-            public String answer(InvocationOnMock invocation) {
-                return mUrl;
-            }
-        });
+        when(mTab.getTitle()).thenAnswer(invocation -> mTitle);
+        when(mTab.getUrl()).thenAnswer(invocation -> mUrl);
 
         MediaSessionTabHelper.sOverriddenMediaSession = mMediaSession;
         mMediaSessionTabHelper = new MediaSessionTabHelper(mTab);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationTitleUpdatedTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationTitleUpdatedTest.java
index 9021c7a..59ad1b1 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationTitleUpdatedTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationTitleUpdatedTest.java
@@ -54,7 +54,7 @@
         doCallRealMethod()
                 .when(mMockForegroundServiceUtils)
                 .startForegroundService(any(Intent.class));
-        mTabHolder = new MediaNotificationTestTabHolder(TAB_ID_1, "about:blank", "title1");
+        mTabHolder = createMediaNotificationTestTabHolder(TAB_ID_1, "about:blank", "title1");
     }
 
     @Test
@@ -136,7 +136,7 @@
         mTabHolder.simulateMediaSessionStateChanged(false, false);
 
         MediaNotificationTestTabHolder newTabHolder =
-                new MediaNotificationTestTabHolder(TAB_ID_2, "about:blank", "title2");
+                createMediaNotificationTestTabHolder(TAB_ID_2, "about:blank", "title2");
 
         newTabHolder.simulateMediaSessionStateChanged(true, false);
         newTabHolder.simulateTitleUpdated("title3");
@@ -160,7 +160,7 @@
         assertEquals("title1", getDisplayedTitle());
 
         MediaNotificationTestTabHolder newTabHolder =
-                new MediaNotificationTestTabHolder(TAB_ID_2, "about:blank", "title2");
+                createMediaNotificationTestTabHolder(TAB_ID_2, "about:blank", "title2");
 
         newTabHolder.simulateMediaSessionStateChanged(true, false);
         newTabHolder.simulateTitleUpdated("title3");
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 83fd70f..bb90d43 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
@@ -16,7 +16,7 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.library_loader.ProcessInitException;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
-import org.chromium.components.aboutui.CreditUtils;
+import org.chromium.components.aboutui.CreditUtilsJni;
 
 import java.io.FileNotFoundException;
 
@@ -55,7 +55,7 @@
                 }
             }
         });
-        CreditUtils.nativeWriteCreditsHtml(output.detachFd());
+        CreditUtilsJni.get().writeCreditsHtml(output.detachFd());
     }
 
     @Override
diff --git a/chrome/app_shim/BUILD.gn b/chrome/app_shim/BUILD.gn
index 93bf394..41d666bb 100644
--- a/chrome/app_shim/BUILD.gn
+++ b/chrome/app_shim/BUILD.gn
@@ -21,6 +21,7 @@
 
   deps = [
     "//chrome:strings",
+    "//chrome/app:command_ids",
     "//chrome/browser/ui",
     "//chrome/common",
     "//chrome/common:mojo_bindings",
diff --git a/chrome/app_shim/DEPS b/chrome/app_shim/DEPS
index 54b4483..be81e88c 100644
--- a/chrome/app_shim/DEPS
+++ b/chrome/app_shim/DEPS
@@ -1,6 +1,8 @@
 include_rules = [
+  "+chrome/app/chrome_command_ids.h",
   "+chrome/app/chrome_crash_reporter_client.h",
   "+chrome/browser/ui/cocoa",
+  "+chrome/grit/generated_resources.h",
   "+chrome/installer/launcher_support",
   "+components/crash/content/app",
   "+components/remote_cocoa",
diff --git a/chrome/app_shim/app_shim_controller.h b/chrome/app_shim/app_shim_controller.h
index 0dfb3c4..b3f10a9 100644
--- a/chrome/app_shim/app_shim_controller.h
+++ b/chrome/app_shim/app_shim_controller.h
@@ -5,6 +5,8 @@
 #ifndef CHROME_APP_SHIM_APP_SHIM_CONTROLLER_H_
 #define CHROME_APP_SHIM_APP_SHIM_CONTROLLER_H_
 
+#include <vector>
+
 #import <AppKit/AppKit.h>
 
 #include "base/files/file_path.h"
@@ -21,6 +23,7 @@
 }
 
 @class AppShimDelegate;
+@class ProfileMenuTarget;
 
 // The AppShimController is responsible for launching and maintaining the
 // connection with the main Chrome process, and generally controls the lifetime
@@ -51,6 +54,9 @@
   bool SendFocusApp(apps::AppShimFocusType focus_type,
                     const std::vector<base::FilePath>& files);
 
+  // Called when a profile is selected from the profiles NSMenu.
+  void ProfileMenuItemSelected(uint32_t index);
+
  private:
   friend class TestShimClient;
   friend class apps::MachBootstrapAcceptorTest;
@@ -72,6 +78,8 @@
   void CreateCommandDispatcherForWidget(uint64_t widget_id) override;
   void SetBadgeLabel(const std::string& badge_label) override;
   void SetUserAttention(apps::AppShimAttentionType attention_type) override;
+  void UpdateProfileMenu(std::vector<chrome::mojom::ProfileMenuItemPtr>
+                             profile_menu_items) override;
 
   // Terminates the app shim process.
   void Close();
@@ -130,6 +138,12 @@
   bool launch_app_done_;
   NSInteger attention_request_id_;
 
+  // The target for NSMenuItems in the profile menu.
+  base::scoped_nsobject<ProfileMenuTarget> profile_menu_target_;
+
+  // The items in the profile menu.
+  std::vector<chrome::mojom::ProfileMenuItemPtr> profile_menu_items_;
+
   DISALLOW_COPY_AND_ASSIGN(AppShimController);
 };
 
diff --git a/chrome/app_shim/app_shim_controller.mm b/chrome/app_shim/app_shim_controller.mm
index 15ef98ce..e9ccc98 100644
--- a/chrome/app_shim/app_shim_controller.mm
+++ b/chrome/app_shim/app_shim_controller.mm
@@ -19,6 +19,7 @@
 #include "base/mac/mach_logging.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/sys_string_conversions.h"
+#include "chrome/app/chrome_command_ids.h"
 #include "chrome/app_shim/app_shim_delegate.h"
 #include "chrome/browser/ui/cocoa/browser_window_command_handler.h"
 #include "chrome/browser/ui/cocoa/chrome_command_dispatcher_delegate.h"
@@ -27,6 +28,7 @@
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/mac/app_mode_common.h"
 #include "chrome/common/process_singleton_lock_posix.h"
+#include "chrome/grit/generated_resources.h"
 #include "components/remote_cocoa/app_shim/application_bridge.h"
 #include "components/remote_cocoa/app_shim/native_widget_ns_window_bridge.h"
 #include "components/remote_cocoa/common/application.mojom.h"
@@ -36,6 +38,38 @@
 #include "mojo/public/cpp/platform/platform_channel.h"
 #include "ui/accelerated_widget_mac/window_resize_helper_mac.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/image/image.h"
+
+// The ProfileMenuTarget bridges between Objective C (as the target for the
+// profile menu NSMenuItems) and C++ (the mojo methods called by
+// AppShimController).
+@interface ProfileMenuTarget : NSObject {
+  AppShimController* controller_;
+}
+- (id)initWithController:(AppShimController*)controller;
+- (void)clearController;
+@end
+
+@implementation ProfileMenuTarget
+- (id)initWithController:(AppShimController*)controller {
+  if (self = [super init])
+    controller_ = controller;
+  return self;
+}
+
+- (void)clearController {
+  controller_ = nullptr;
+}
+
+- (void)profileMenuItemSelected:(id)sender {
+  if (controller_)
+    controller_->ProfileMenuItemSelected([sender tag]);
+}
+
+- (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)item {
+  return YES;
+}
+@end
 
 namespace {
 // The maximum amount of time to wait for Chrome's AppShimListener to be
@@ -60,7 +94,9 @@
       host_request_(mojo::MakeRequest(&host_)),
       delegate_([[AppShimDelegate alloc] init]),
       launch_app_done_(false),
-      attention_request_id_(0) {
+      attention_request_id_(0),
+      profile_menu_target_(
+          [[ProfileMenuTarget alloc] initWithController:this]) {
   // Since AppShimController is created before the main message loop starts,
   // NSApp will not be set, so use sharedApplication.
   NSApplication* sharedApplication = [NSApplication sharedApplication];
@@ -77,6 +113,7 @@
   // Un-set the delegate since NSApplication does not retain it.
   NSApplication* sharedApplication = [NSApplication sharedApplication];
   [sharedApplication setDelegate:nil];
+  [profile_menu_target_ clearController];
 }
 
 void AppShimController::FindOrLaunchChrome() {
@@ -291,6 +328,10 @@
 
 void AppShimController::SetUpMenu() {
   chrome::BuildMainMenu(NSApp, delegate_, params_.app_name, true);
+
+  // Initialize the profiles menu to be empty. It will be updated from the
+  // browser.
+  UpdateProfileMenu(std::vector<chrome::mojom::ProfileMenuItemPtr>());
 }
 
 void AppShimController::BootstrapChannelError(uint32_t custom_reason,
@@ -354,6 +395,41 @@
   NSApp.dockTile.badgeLabel = base::SysUTF8ToNSString(badge_label);
 }
 
+void AppShimController::UpdateProfileMenu(
+    std::vector<chrome::mojom::ProfileMenuItemPtr> profile_menu_items) {
+  profile_menu_items_ = std::move(profile_menu_items);
+
+  NSMenuItem* cocoa_profile_menu =
+      [[NSApp mainMenu] itemWithTag:IDC_PROFILE_MAIN_MENU];
+  if (profile_menu_items_.empty()) {
+    [cocoa_profile_menu setSubmenu:nil];
+    [cocoa_profile_menu setHidden:YES];
+    return;
+  }
+  [cocoa_profile_menu setHidden:NO];
+
+  base::scoped_nsobject<NSMenu> menu(
+      [[NSMenu alloc] initWithTitle:l10n_util::GetNSStringWithFixup(
+                                        IDS_PROFILES_OPTIONS_GROUP_NAME)]);
+  [cocoa_profile_menu setSubmenu:menu];
+
+  // Note that this code to create menu items is nearly identical to the code
+  // in ProfileMenuController in the browser process.
+  for (const auto& mojo_item : profile_menu_items_) {
+    NSString* name = base::SysUTF16ToNSString(mojo_item->name);
+    NSMenuItem* item =
+        [[[NSMenuItem alloc] initWithTitle:name
+                                    action:@selector(profileMenuItemSelected:)
+                             keyEquivalent:@""] autorelease];
+    [item setTag:mojo_item->menu_index];
+    [item setState:mojo_item->active ? NSOnState : NSOffState];
+    [item setTarget:profile_menu_target_.get()];
+    gfx::Image icon(mojo_item->icon);
+    [item setImage:icon.ToNSImage()];
+    [menu insertItem:item atIndex:mojo_item->menu_index];
+  }
+}
+
 void AppShimController::SetUserAttention(
     apps::AppShimAttentionType attention_type) {
   switch (attention_type) {
@@ -386,3 +462,12 @@
 
   return false;
 }
+
+void AppShimController::ProfileMenuItemSelected(uint32_t index) {
+  for (const auto& mojo_item : profile_menu_items_) {
+    if (mojo_item->menu_index == index) {
+      host_->ProfileSelectedFromMenu(mojo_item->profile_path);
+      return;
+    }
+  }
+}
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 9eb73de..e7088fa5 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -321,8 +321,6 @@
     "component_updater/file_type_policies_component_installer.h",
     "component_updater/mei_preload_component_installer.cc",
     "component_updater/mei_preload_component_installer.h",
-    "component_updater/on_device_head_suggest_component_installer.cc",
-    "component_updater/on_device_head_suggest_component_installer.h",
     "component_updater/optimization_hints_component_installer.cc",
     "component_updater/optimization_hints_component_installer.h",
     "component_updater/origin_trials_component_installer.cc",
@@ -1978,6 +1976,7 @@
     "//components/cloud_devices/common",
     "//components/component_updater",
     "//components/component_updater:crl_set_remover",
+    "//components/component_updater/installer_policies",
     "//components/consent_auditor",
     "//components/content_capture/browser",
     "//components/content_settings/core/browser",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS
index 9d9e185c..e701a24 100644
--- a/chrome/browser/DEPS
+++ b/chrome/browser/DEPS
@@ -55,6 +55,7 @@
   "+components/chromeos_camera",
   "+components/cloud_devices/common",
   "+components/component_updater",
+  "+components/component_updater/installer_policies",
   "+components/consent_auditor",
   "+components/constrained_window",
   "+components/content_capture/browser",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 39538309..2670fea 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -4614,6 +4614,10 @@
      FEATURE_VALUE_TYPE(omnibox::kOmniboxRemoveSuggestionsFromClipboard)},
 #endif  // defined(OS_ANDROID)
 
+    {"percent-based-scrolling", flag_descriptions::kPercentBasedScrollingName,
+     flag_descriptions::kPercentBasedScrollingDescription, kOsAll,
+     FEATURE_VALUE_TYPE(features::kPercentBasedScrolling)},
+
     // NOTE: Adding a new flag requires adding a corresponding entry to enum
     // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
     // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/android/compositor/scene_layer/status_indicator_scene_layer.cc b/chrome/browser/android/compositor/scene_layer/status_indicator_scene_layer.cc
index ff7dd47..fb24500 100644
--- a/chrome/browser/android/compositor/scene_layer/status_indicator_scene_layer.cc
+++ b/chrome/browser/android/compositor/scene_layer/status_indicator_scene_layer.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/browser/android/compositor/scene_layer/status_indicator_scene_layer.h"
 
-#include "cc/layers/solid_color_layer.h"
+#include "cc/layers/ui_resource_layer.h"
 #include "chrome/android/chrome_jni_headers/StatusIndicatorSceneLayer_jni.h"
 
 using base::android::JavaParamRef;
@@ -17,14 +17,13 @@
     const JavaRef<jobject>& jobj)
     : SceneLayer(env, jobj),
       view_container_(cc::Layer::Create()),
-      view_layer_(cc::SolidColorLayer::Create()) {
+      view_layer_(cc::UIResourceLayer::Create()) {
   layer()->SetIsDrawable(true);
 
   view_container_->SetIsDrawable(true);
   view_container_->SetMasksToBounds(true);
 
   view_layer_->SetIsDrawable(true);
-  view_layer_->SetBackgroundColor(SK_ColorRED);
   view_container_->AddChild(view_layer_);
 }
 
@@ -35,12 +34,22 @@
     const base::android::JavaParamRef<jobject>& object,
     const base::android::JavaParamRef<jobject>& jresource_manager,
     jint view_resource_id) {
-  // This is temporary as the size should come from the resource.
-  view_container_->SetBounds(gfx::Size(1440, 70));
+  ui::ResourceManager* resource_manager =
+      ui::ResourceManagerImpl::FromJavaObject(jresource_manager);
+  ui::Resource* resource = resource_manager->GetResource(
+      ui::ANDROID_RESOURCE_TYPE_DYNAMIC, view_resource_id);
+
+  // If the resource isn't available, don't bother doing anything else.
+  if (!resource)
+    return;
+
+  view_layer_->SetUIResourceId(resource->ui_resource()->id());
+
+  view_container_->SetBounds(resource->size());
   view_container_->SetPosition(gfx::PointF(0, 0));
 
   // The view's layer should be the same size as the texture.
-  view_layer_->SetBounds(gfx::Size(gfx::Size(1440, 70)));
+  view_layer_->SetBounds(resource->size());
   view_layer_->SetPosition(gfx::PointF(0, 0));
 }
 
@@ -57,6 +66,18 @@
     layer_->AddChild(content_tree->layer());
     layer_->AddChild(view_container_);
   }
+
+  // Propagate the background color up from the content layer.
+  should_show_background_ = content_tree->ShouldShowBackground();
+  background_color_ = content_tree->GetBackgroundColor();
+}
+
+SkColor StatusIndicatorSceneLayer::GetBackgroundColor() {
+  return background_color_;
+}
+
+bool StatusIndicatorSceneLayer::ShouldShowBackground() {
+  return should_show_background_;
 }
 
 static jlong JNI_StatusIndicatorSceneLayer_Init(
diff --git a/chrome/browser/android/compositor/scene_layer/status_indicator_scene_layer.h b/chrome/browser/android/compositor/scene_layer/status_indicator_scene_layer.h
index 59f105e..54c9eb7c 100644
--- a/chrome/browser/android/compositor/scene_layer/status_indicator_scene_layer.h
+++ b/chrome/browser/android/compositor/scene_layer/status_indicator_scene_layer.h
@@ -14,7 +14,7 @@
 
 namespace cc {
 class Layer;
-class SolidColorLayer;
+class UIResourceLayer;
 }  // namespace cc
 
 namespace android {
@@ -37,9 +37,14 @@
       const base::android::JavaParamRef<jobject>& jobj,
       const base::android::JavaParamRef<jobject>& jcontent_tree);
 
+  SkColor GetBackgroundColor() override;
+  bool ShouldShowBackground() override;
+
  private:
+  bool should_show_background_;
+  SkColor background_color_;
   scoped_refptr<cc::Layer> view_container_;
-  scoped_refptr<cc::SolidColorLayer> view_layer_;
+  scoped_refptr<cc::UIResourceLayer> view_layer_;
 
   DISALLOW_COPY_AND_ASSIGN(StatusIndicatorSceneLayer);
 };
diff --git a/chrome/browser/apps/app_shim/app_shim_host_mac.cc b/chrome/browser/apps/app_shim/app_shim_host_mac.cc
index b673d14..2759cab 100644
--- a/chrome/browser/apps/app_shim/app_shim_host_mac.cc
+++ b/chrome/browser/apps/app_shim/app_shim_host_mac.cc
@@ -152,6 +152,10 @@
   client_->OnShimFocus(this, focus_type, files);
 }
 
+void AppShimHost::ProfileSelectedFromMenu(const base::FilePath& profile_path) {
+  client_->OnShimSelectedProfile(this, profile_path);
+}
+
 base::FilePath AppShimHost::GetProfilePath() const {
   return profile_path_;
 }
diff --git a/chrome/browser/apps/app_shim/app_shim_host_mac.h b/chrome/browser/apps/app_shim/app_shim_host_mac.h
index 56ee252..bb188d7 100644
--- a/chrome/browser/apps/app_shim/app_shim_host_mac.h
+++ b/chrome/browser/apps/app_shim/app_shim_host_mac.h
@@ -54,6 +54,10 @@
     virtual void OnShimFocus(AppShimHost* host,
                              apps::AppShimFocusType focus_type,
                              const std::vector<base::FilePath>& files) = 0;
+
+    // Invoked when a profile is selected from the menu bar.
+    virtual void OnShimSelectedProfile(AppShimHost* host,
+                                       const base::FilePath& profile_path) = 0;
   };
 
   AppShimHost(Client* client,
@@ -105,6 +109,7 @@
   // chrome::mojom::AppShimHost.
   void FocusApp(apps::AppShimFocusType focus_type,
                 const std::vector<base::FilePath>& files) override;
+  void ProfileSelectedFromMenu(const base::FilePath& profile_path) override;
 
   // Weak, owns |this|.
   Client* const client_;
diff --git a/chrome/browser/apps/app_shim/app_shim_host_mac_unittest.cc b/chrome/browser/apps/app_shim/app_shim_host_mac_unittest.cc
index c9ddcf0c..55c9924 100644
--- a/chrome/browser/apps/app_shim/app_shim_host_mac_unittest.cc
+++ b/chrome/browser/apps/app_shim/app_shim_host_mac_unittest.cc
@@ -58,6 +58,8 @@
   void CreateCommandDispatcherForWidget(uint64_t widget_id) override {}
   void SetUserAttention(apps::AppShimAttentionType attention_type) override {}
   void SetBadgeLabel(const std::string& badge_label) override {}
+  void UpdateProfileMenu(std::vector<chrome::mojom::ProfileMenuItemPtr>
+                             profile_menu_items) override {}
 
   bool received_launch_done_result_ = false;
   apps::AppShimLaunchResult launch_done_result_ = apps::APP_SHIM_LAUNCH_SUCCESS;
@@ -171,6 +173,8 @@
                    const std::vector<base::FilePath>& file) override {
     ++focus_count_;
   }
+  void OnShimSelectedProfile(AppShimHost* host,
+                             const base::FilePath& profile_path) override {}
 
   apps::AppShimLaunchResult launch_result_ = apps::APP_SHIM_LAUNCH_SUCCESS;
   int launch_count_ = 0;
diff --git a/chrome/browser/apps/app_shim/app_shim_interactive_uitest_mac.mm b/chrome/browser/apps/app_shim/app_shim_interactive_uitest_mac.mm
index f6a7a4d1..0255e07 100644
--- a/chrome/browser/apps/app_shim/app_shim_interactive_uitest_mac.mm
+++ b/chrome/browser/apps/app_shim/app_shim_interactive_uitest_mac.mm
@@ -121,6 +121,8 @@
   void OnShimFocus(AppShimHost* host,
                    apps::AppShimFocusType focus_type,
                    const std::vector<base::FilePath>& files) override {}
+  void OnShimSelectedProfile(AppShimHost* host,
+                             const base::FilePath& profile_path) override {}
 
  private:
   std::string app_mode_id_;
diff --git a/chrome/browser/apps/app_shim/app_shim_listener_browsertest_mac.mm b/chrome/browser/apps/app_shim/app_shim_listener_browsertest_mac.mm
index 508ace5..9f09c93f 100644
--- a/chrome/browser/apps/app_shim/app_shim_listener_browsertest_mac.mm
+++ b/chrome/browser/apps/app_shim/app_shim_listener_browsertest_mac.mm
@@ -68,6 +68,8 @@
   void CreateCommandDispatcherForWidget(uint64_t widget_id) override {}
   void SetUserAttention(apps::AppShimAttentionType attention_type) override {}
   void SetBadgeLabel(const std::string& badge_label) override {}
+  void UpdateProfileMenu(std::vector<chrome::mojom::ProfileMenuItemPtr>
+                             profile_menu_items) override {}
 
  private:
   void OnShimConnectedDone(apps::AppShimLaunchResult result,
@@ -129,6 +131,7 @@
   // chrome::mojom::AppShimHost.
   void FocusApp(apps::AppShimFocusType focus_type,
                 const std::vector<base::FilePath>& files) override {}
+  void ProfileSelectedFromMenu(const base::FilePath& profile_path) override {}
 
   std::unique_ptr<base::RunLoop> runner_;
   mojo::Binding<chrome::mojom::AppShimHost> binding_;
diff --git a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.cc b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.cc
index 06441cde..741dbb54f 100644
--- a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.cc
+++ b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.cc
@@ -27,9 +27,11 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/extensions/launch_util.h"
+#include "chrome/browser/profiles/avatar_menu.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_attributes_entry.h"
 #include "chrome/browser/profiles/profile_attributes_storage.h"
+#include "chrome/browser/profiles/profile_avatar_icon_util.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/profiles/profile_window.h"
 #include "chrome/browser/profiles/profiles_state.h"
@@ -258,6 +260,13 @@
   return multi_profile_host.get();
 }
 
+std::unique_ptr<AvatarMenu> ExtensionAppShimHandler::Delegate::CreateAvatarMenu(
+    AvatarMenuObserver* observer) {
+  ProfileManager* profile_manager = g_browser_process->profile_manager();
+  return std::make_unique<AvatarMenu>(
+      &profile_manager->GetProfileAttributesStorage(), observer, nullptr);
+}
+
 base::FilePath ExtensionAppShimHandler::Delegate::GetFullProfilePath(
     const base::FilePath& relative_profile_path) {
   ProfileManager* profile_manager = g_browser_process->profile_manager();
@@ -723,6 +732,18 @@
   delegate_->LaunchApp(profile, extension, files);
 }
 
+void ExtensionAppShimHandler::OnShimSelectedProfile(
+    AppShimHost* host,
+    const base::FilePath& profile_path) {
+  // TODO(https://crbug.com/982024): Handle the case where the profile exists
+  // but is not loaded yet.
+  Profile* profile = delegate_->ProfileForPath(profile_path);
+  const Extension* extension =
+      delegate_->MaybeGetAppExtension(profile, host->GetAppId());
+  std::vector<base::FilePath> files;
+  delegate_->LaunchApp(profile, extension, files);
+}
+
 void ExtensionAppShimHandler::set_delegate(Delegate* delegate) {
   delegate_.reset(delegate);
 }
@@ -816,6 +837,62 @@
   }
 }
 
+void ExtensionAppShimHandler::OnBrowserSetLastActive(Browser* browser) {
+  // Defer creation of the avatar menu until the active browser window changes,
+  // to allow tests to override |delegate_|.
+  if (!avatar_menu_) {
+    avatar_menu_ = delegate_->CreateAvatarMenu(this);
+    return;
+  }
+  if (!avatar_menu_)
+    return;
+  avatar_menu_->ActiveBrowserChanged(browser);
+  for (auto& iter_app : apps_) {
+    AppState* app_state = iter_app.second.get();
+    if (app_state->IsMultiProfile())
+      UpdateHostProfileMenu(app_state->multi_profile_host.get());
+  }
+}
+
+void ExtensionAppShimHandler::OnAvatarMenuChanged(AvatarMenu* menu) {
+  if (!avatar_menu_)
+    return;
+  for (auto& iter_app : apps_) {
+    AppState* app_state = iter_app.second.get();
+    if (app_state->IsMultiProfile())
+      UpdateHostProfileMenu(app_state->multi_profile_host.get());
+  }
+}
+
+void ExtensionAppShimHandler::UpdateHostProfileMenu(AppShimHost* host) {
+  std::vector<chrome::mojom::ProfileMenuItemPtr> mojo_items;
+  for (size_t i = 0; i < avatar_menu_->GetNumberOfItems(); ++i) {
+    // TODO(https://crbug.com/982024): Skip profiles for which this extension
+    // is not installed.
+    auto mojo_item = chrome::mojom::ProfileMenuItem::New();
+    const AvatarMenu::Item& item = avatar_menu_->GetItemAt(i);
+    mojo_item->name = item.name;
+    mojo_item->menu_index = item.menu_index;
+    mojo_item->active = item.active;
+    mojo_item->profile_path = item.profile_path;
+    {
+      // Scale the icon as needed (see ProfileMenuController).
+      gfx::Image itemIcon;
+      AvatarMenu::GetImageForMenuButton(item.profile_path, &itemIcon);
+      static constexpr int kMenuAvatarIconSize = 38;
+      if (itemIcon.Width() > kMenuAvatarIconSize ||
+          itemIcon.Height() > kMenuAvatarIconSize) {
+        itemIcon = profiles::GetSizedAvatarIcon(itemIcon, /*is_rectangle=*/true,
+                                                kMenuAvatarIconSize,
+                                                kMenuAvatarIconSize);
+      }
+      mojo_item->icon = *itemIcon.ToImageSkia();
+    }
+    mojo_items.push_back(std::move(mojo_item));
+  }
+  host->GetAppShim()->UpdateProfileMenu(std::move(mojo_items));
+}
+
 ExtensionAppShimHandler::ProfileState*
 ExtensionAppShimHandler::GetOrCreateProfileState(
     Profile* profile,
diff --git a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h
index ff8e325..695050c 100644
--- a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h
+++ b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h
@@ -17,6 +17,7 @@
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/apps/app_shim/app_shim_host_bootstrap_mac.h"
 #include "chrome/browser/apps/app_shim/app_shim_host_mac.h"
+#include "chrome/browser/profiles/avatar_menu_observer.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_list_observer.h"
 #include "content/public/browser/notification_observer.h"
@@ -46,12 +47,15 @@
                                 public AppShimHost::Client,
                                 public content::NotificationObserver,
                                 public AppLifetimeMonitor::Observer,
-                                public BrowserListObserver {
+                                public BrowserListObserver,
+                                public AvatarMenuObserver {
  public:
   class Delegate {
    public:
     virtual ~Delegate() {}
 
+    virtual std::unique_ptr<AvatarMenu> CreateAvatarMenu(
+        AvatarMenuObserver* observer);
     virtual base::FilePath GetFullProfilePath(
         const base::FilePath& relative_path);
     virtual bool ProfileExistsForPath(const base::FilePath& path);
@@ -131,6 +135,8 @@
   void OnShimFocus(AppShimHost* host,
                    AppShimFocusType focus_type,
                    const std::vector<base::FilePath>& files) override;
+  void OnShimSelectedProfile(AppShimHost* host,
+                             const base::FilePath& profile_path) override;
 
   // AppLifetimeMonitor::Observer overrides:
   void OnAppStart(content::BrowserContext* context,
@@ -150,6 +156,10 @@
   // BrowserListObserver overrides;
   void OnBrowserAdded(Browser* browser) override;
   void OnBrowserRemoved(Browser* browser) override;
+  void OnBrowserSetLastActive(Browser* browser) override;
+
+  // AvatarMenuObserver:
+  void OnAvatarMenuChanged(AvatarMenu* menu) override;
 
  protected:
   typedef std::set<Browser*> BrowserSet;
@@ -181,6 +191,9 @@
   // where the extension is disabled.
   void OnExtensionEnabled(std::unique_ptr<AppShimHostBootstrap> bootstrap);
 
+  // Update the profiles menu for the specified host.
+  void UpdateHostProfileMenu(AppShimHost* host);
+
   std::unique_ptr<Delegate> delegate_;
 
   // Retrieve the ProfileState for a given (Profile, Extension) pair. If one
@@ -193,6 +206,9 @@
 
   content::NotificationRegistrar registrar_;
 
+  // The avatar menu instance used by all app shims.
+  std::unique_ptr<AvatarMenu> avatar_menu_;
+
   base::WeakPtrFactory<ExtensionAppShimHandler> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(ExtensionAppShimHandler);
diff --git a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac_unittest.cc b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac_unittest.cc
index 70e92fb..9fa6173 100644
--- a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac_unittest.cc
+++ b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac_unittest.cc
@@ -20,6 +20,7 @@
 #include "chrome/browser/apps/app_shim/app_shim_host_bootstrap_mac.h"
 #include "chrome/browser/apps/app_shim/app_shim_host_mac.h"
 #include "chrome/browser/chrome_notification_types.h"
+#include "chrome/browser/profiles/avatar_menu.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/test/base/testing_profile.h"
 #include "content/public/browser/notification_service.h"
@@ -44,6 +45,10 @@
  public:
   virtual ~MockDelegate() {}
 
+  std::unique_ptr<AvatarMenu> CreateAvatarMenu(
+      AvatarMenuObserver* observer) override {
+    return nullptr;
+  }
   base::FilePath GetFullProfilePath(const base::FilePath& relative_path) {
     return relative_path;
   }
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 511c013..87414012 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -58,7 +58,6 @@
 #include "chrome/browser/component_updater/crl_set_component_installer.h"
 #include "chrome/browser/component_updater/file_type_policies_component_installer.h"
 #include "chrome/browser/component_updater/mei_preload_component_installer.h"
-#include "chrome/browser/component_updater/on_device_head_suggest_component_installer.h"
 #include "chrome/browser/component_updater/optimization_hints_component_installer.h"
 #include "chrome/browser/component_updater/origin_trials_component_installer.h"
 #include "chrome/browser/component_updater/pepper_flash_component_installer.h"
@@ -128,6 +127,7 @@
 #include "chrome/installer/util/google_update_settings.h"
 #include "components/component_updater/component_updater_service.h"
 #include "components/component_updater/crl_set_remover.h"
+#include "components/component_updater/installer_policies/on_device_head_suggest_component_installer.h"
 #include "components/device_event_log/device_event_log.h"
 #include "components/flags_ui/pref_service_flags_storage.h"
 #include "components/google/core/common/google_util.h"
@@ -489,7 +489,8 @@
 #endif
 
   RegisterSubresourceFilterComponent(cus);
-  RegisterOnDeviceHeadSuggestComponent(cus);
+  RegisterOnDeviceHeadSuggestComponent(
+      cus, g_browser_process->GetApplicationLocale());
   RegisterOptimizationHintsComponent(cus, profile_prefs);
 
   base::FilePath path;
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 47968ee..ec76f063 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -1664,13 +1664,6 @@
 bool ChromeContentBrowserClient::ShouldAllowOpenURL(
     content::SiteInstance* site_instance,
     const GURL& url) {
-#if BUILDFLAG(ENABLE_EXTENSIONS)
-  bool result;
-  if (ChromeContentBrowserClientExtensionsPart::ShouldAllowOpenURL(
-          site_instance, url, &result))
-    return result;
-#endif
-
   // Do not allow chrome://chrome-signin navigate to other chrome:// URLs, since
   // the signin page may host untrusted web content.
   GURL from_url = site_instance->GetSiteURL();
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 8dc435f..aa3c5eb2 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -2534,7 +2534,9 @@
     "extensions/login_screen/login_state/login_state_api_unittest.cc",
     "extensions/login_screen/login_state/session_state_changed_event_dispatcher_unittest.cc",
     "extensions/permissions_updater_delegate_chromeos_unittest.cc",
+    "extensions/printing_metrics/print_job_finished_event_dispatcher_unittest.cc",
     "extensions/printing_metrics/print_job_info_idl_conversions_unittest.cc",
+    "extensions/printing_metrics/printing_metrics_api_unittest.cc",
     "extensions/public_session_permission_helper_unittest.cc",
     "extensions/quick_unlock_private/quick_unlock_private_api_unittest.cc",
     "extensions/signin_screen_policy_provider_unittest.cc",
diff --git a/chrome/browser/chromeos/arc/print_spooler/arc_print_spooler_util.cc b/chrome/browser/chromeos/arc/print_spooler/arc_print_spooler_util.cc
index c16a4409..77daa03 100644
--- a/chrome/browser/chromeos/arc/print_spooler/arc_print_spooler_util.cc
+++ b/chrome/browser/chromeos/arc/print_spooler/arc_print_spooler_util.cc
@@ -46,8 +46,8 @@
   char buf[4096];
   int bytes;
   while ((bytes = src_file.ReadAtCurrentPos(buf, sizeof(buf))) > 0) {
-    int written = temp.WriteAtCurrentPos(buf, bytes);
-    if (written != bytes) {
+    if (!temp.WriteAtCurrentPosAndCheck(
+            base::as_bytes(base::make_span(buf, bytes)))) {
       PLOG(ERROR) << "Error while saving PDF to disk.";
       return base::FilePath();
     }
diff --git a/chrome/browser/chromeos/arc/tracing/arc_system_stat_collector.cc b/chrome/browser/chromeos/arc/tracing/arc_system_stat_collector.cc
index fbcaee4..cbb9d44 100644
--- a/chrome/browser/chromeos/arc/tracing/arc_system_stat_collector.cc
+++ b/chrome/browser/chromeos/arc/tracing/arc_system_stat_collector.cc
@@ -4,14 +4,20 @@
 
 #include "chrome/browser/chromeos/arc/tracing/arc_system_stat_collector.h"
 
+#include <fcntl.h>
+#include <sys/types.h>
+#include <unistd.h>
+
 #include "base/bind.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_util.h"
+#include "base/files/scoped_file.h"
 #include "base/logging.h"
 #include "base/no_destructor.h"
 #include "base/strings/string_util.h"
 #include "base/task/post_task.h"
 #include "base/task_runner_util.h"
+#include "base/threading/scoped_blocking_call.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "chrome/browser/chromeos/arc/tracing/arc_system_model.h"
@@ -25,6 +31,18 @@
 constexpr base::TimeDelta kSystemStatUpdateInterval =
     base::TimeDelta::FromMilliseconds(10);
 
+const base::FilePath::CharType kZramPath[] =
+    FILE_PATH_LITERAL("/sys/block/zram0/stat");
+const base::FilePath::CharType kMemoryInfoPath[] =
+    FILE_PATH_LITERAL("/proc/meminfo");
+#if defined(ARCH_CPU_ARM_FAMILY)
+const base::FilePath::CharType kGemInfoPath[] =
+    FILE_PATH_LITERAL("/run/debugfs_gpu/exynos_gem_objects");
+#else
+const base::FilePath::CharType kGemInfoPath[] =
+    FILE_PATH_LITERAL("/run/debugfs_gpu/i915_gem_objects");
+#endif
+
 bool IsWhitespace(char c) {
   return c == ' ' || c == '\t' || c == '\n';
 }
@@ -90,6 +108,8 @@
   return instance->path();
 }
 
+enum SystemReader { kZram = 0, kMemoryInfo, kGemInfo, kCpuTemperature, kTotal };
+
 }  // namespace
 
 struct ArcSystemStatCollector::Sample {
@@ -104,6 +124,52 @@
   int cpu_temperature = std::numeric_limits<int>::min();
 };
 
+struct ArcSystemStatCollector::SystemReadersContext {
+  // Creates and initializes |SystemReadersContext|. Must be called on
+  // background thread.
+  static std::unique_ptr<SystemReadersContext> InitOnBackgroundThread() {
+    std::unique_ptr<SystemReadersContext> context =
+        std::make_unique<SystemReadersContext>();
+
+    context->system_readers[SystemReader::kZram].reset(
+        open(kZramPath, O_RDONLY));
+    if (!context->system_readers[SystemReader::kZram].is_valid()) {
+      LOG(ERROR) << "Failed to open zram stat file: " << kZramPath;
+    }
+
+    context->system_readers[SystemReader::kMemoryInfo].reset(
+        open(kMemoryInfoPath, O_RDONLY));
+    if (!context->system_readers[SystemReader::kMemoryInfo].is_valid()) {
+      LOG(ERROR) << "Failed to open mem info file: " << kMemoryInfoPath;
+    }
+
+    context->system_readers[SystemReader::kGemInfo].reset(
+        open(kGemInfoPath, O_RDONLY));
+    if (!context->system_readers[SystemReader::kGemInfo].is_valid()) {
+      LOG(ERROR) << "Failed to open gem info file: " << kGemInfoPath;
+    }
+
+    const base::FilePath& cpu_temp_path = GetCpuTemperaturePathOnFileThread();
+    context->system_readers[SystemReader::kCpuTemperature].reset(
+        open(cpu_temp_path.value().c_str(), O_RDONLY));
+    if (!context->system_readers[SystemReader::kCpuTemperature].is_valid()) {
+      LOG(ERROR) << "Failed to open cpu temperature file: " << cpu_temp_path.value();
+    }
+
+    return context;
+  }
+
+  // Releases |context|. Must be called on background thread.
+  static void FreeOnBackgroundThread(
+      std::unique_ptr<ArcSystemStatCollector::SystemReadersContext> context) {
+    DCHECK(context);
+    context.reset();
+  }
+
+  base::ScopedFD system_readers[SystemReader::kTotal];
+  RuntimeFrame current_frame;
+};
+
 // static
 constexpr int ArcSystemStatCollector::kZramStatColumns[];
 
@@ -118,7 +184,9 @@
 
 ArcSystemStatCollector::ArcSystemStatCollector() {}
 
-ArcSystemStatCollector::~ArcSystemStatCollector() = default;
+ArcSystemStatCollector::~ArcSystemStatCollector() {
+  FreeSystemReadersContext();
+}
 
 void ArcSystemStatCollector::Start(const base::TimeDelta& max_interval) {
   const size_t sample_count =
@@ -131,17 +199,19 @@
 
   background_task_runner_ = base::CreateSequencedTaskRunner(
       {base::ThreadPool(), base::MayBlock(), base::TaskPriority::USER_VISIBLE});
-  timer_.Start(
-      FROM_HERE, kSystemStatUpdateInterval,
-      base::BindRepeating(&ArcSystemStatCollector::ScheduleSystemStatUpdate,
-                          base::Unretained(this)));
+
+  base::PostTaskAndReplyWithResult(
+      background_task_runner_.get(), FROM_HERE,
+      base::BindOnce(&SystemReadersContext::InitOnBackgroundThread),
+      base::BindOnce(&ArcSystemStatCollector::OnInitOnUiThread,
+                     weak_ptr_factory_.GetWeakPtr()));
 }
 
 void ArcSystemStatCollector::Stop() {
   weak_ptr_factory_.InvalidateWeakPtrs();
   background_task_runner_.reset();
   timer_.Stop();
-  request_scheduled_ = false;
+  FreeSystemReadersContext();
 }
 
 void ArcSystemStatCollector::Flush(const base::TimeTicks& min_timestamp,
@@ -195,114 +265,139 @@
 }
 
 void ArcSystemStatCollector::ScheduleSystemStatUpdate() {
-  if (request_scheduled_) {
+  if (!context_) {
     if (missed_update_warning_left_-- > 0)
       LOG(WARNING) << "Dropping update, already pending";
     return;
   }
-  base::TaskRunner* task_runner = background_task_runner_.get();
   base::PostTaskAndReplyWithResult(
-      task_runner, FROM_HERE,
-      base::BindOnce(&ArcSystemStatCollector::ReadSystemStatOnBackgroundThread),
+      background_task_runner_.get(), FROM_HERE,
+      base::BindOnce(&ArcSystemStatCollector::ReadSystemStatOnBackgroundThread,
+                     std::move(context_)),
       base::BindOnce(&ArcSystemStatCollector::UpdateSystemStatOnUiThread,
                      weak_ptr_factory_.GetWeakPtr()));
-  request_scheduled_ = true;
+}
+
+void ArcSystemStatCollector::FreeSystemReadersContext() {
+  if (!context_)
+    return;
+  base::PostTask(
+      FROM_HERE,
+      {base::ThreadPool(), base::MayBlock(), base::TaskPriority::BEST_EFFORT},
+      base::BindOnce(&SystemReadersContext::FreeOnBackgroundThread,
+                     std::move(context_)));
+}
+
+void ArcSystemStatCollector::OnInitOnUiThread(
+    std::unique_ptr<ArcSystemStatCollector::SystemReadersContext> context) {
+  DCHECK(!context_ && context);
+  context_ = std::move(context);
+
+  timer_.Start(
+      FROM_HERE, kSystemStatUpdateInterval,
+      base::BindRepeating(&ArcSystemStatCollector::ScheduleSystemStatUpdate,
+                          base::Unretained(this)));
 }
 
 // static
-ArcSystemStatCollector::RuntimeFrame
-ArcSystemStatCollector::ReadSystemStatOnBackgroundThread() {
-  const base::FilePath zram_stat_path(
-      FILE_PATH_LITERAL("/sys/block/zram0/stat"));
-  const base::FilePath mem_info_path(FILE_PATH_LITERAL("/proc/meminfo"));
-
-  ArcSystemStatCollector::RuntimeFrame current_frame;
-  if (!ParseStatFile(zram_stat_path, kZramStatColumns,
-                     current_frame.zram_stat)) {
-    memset(current_frame.zram_stat, 0, sizeof(current_frame.zram_stat));
+std::unique_ptr<ArcSystemStatCollector::SystemReadersContext>
+ArcSystemStatCollector::ReadSystemStatOnBackgroundThread(
+    std::unique_ptr<SystemReadersContext> context) {
+  DCHECK(context);
+  if (!context->system_readers[SystemReader::kZram].is_valid() ||
+      !ParseStatFile(context->system_readers[SystemReader::kZram].get(),
+                     kZramStatColumns, context->current_frame.zram_stat)) {
+    memset(context->current_frame.zram_stat, 0,
+           sizeof(context->current_frame.zram_stat));
     static bool error_reported = false;
     if (!error_reported) {
-      LOG(ERROR) << "Failed to read zram stat file: " << zram_stat_path.value();
+      LOG(ERROR) << "Failed to read zram stat file: " << kZramPath;
       error_reported = true;
     }
   }
 
-  if (!ParseStatFile(mem_info_path, kMemInfoColumns, current_frame.mem_info)) {
-    memset(current_frame.mem_info, 0, sizeof(current_frame.mem_info));
+  if (!context->system_readers[SystemReader::kMemoryInfo].is_valid() ||
+      !ParseStatFile(context->system_readers[SystemReader::kMemoryInfo].get(),
+                     kMemInfoColumns, context->current_frame.mem_info)) {
+    memset(context->current_frame.mem_info, 0,
+           sizeof(context->current_frame.mem_info));
     static bool error_reported = false;
     if (!error_reported) {
-      LOG(ERROR) << "Failed to read mem info file: " << mem_info_path.value();
+      LOG(ERROR) << "Failed to read mem info file: " << kMemoryInfoPath;
       error_reported = true;
     }
   }
 
-#if defined(ARCH_CPU_ARM_FAMILY)
-  const base::FilePath gem_info_path(
-      FILE_PATH_LITERAL("/run/debugfs_gpu/exynos_gem_objects"));
-#else
-  const base::FilePath gem_info_path(
-      FILE_PATH_LITERAL("/run/debugfs_gpu/i915_gem_objects"));
-#endif
-  if (!ParseStatFile(gem_info_path, kGemInfoColumns, current_frame.gem_info)) {
-    memset(current_frame.gem_info, 0, sizeof(current_frame.gem_info));
+  if (!context->system_readers[SystemReader::kGemInfo].is_valid() ||
+      !ParseStatFile(context->system_readers[SystemReader::kGemInfo].get(),
+                     kGemInfoColumns, context->current_frame.gem_info)) {
+    memset(context->current_frame.gem_info, 0,
+           sizeof(context->current_frame.gem_info));
     static bool error_reported = false;
     if (!error_reported) {
-      LOG(ERROR) << "Failed to read gem info file: " << gem_info_path.value();
+      LOG(ERROR) << "Failed to read gem info file: " << kGemInfoColumns;
       error_reported = true;
     }
   }
 
-  const base::FilePath& cpu_temp_path = GetCpuTemperaturePathOnFileThread();
-  if (cpu_temp_path.empty() ||
-      !ParseStatFile(cpu_temp_path, kCpuTempInfoColumns,
-                     &current_frame.cpu_temperature_)) {
-    current_frame.cpu_temperature_ = std::numeric_limits<int>::min();
+  if (!context->system_readers[SystemReader::kCpuTemperature].is_valid() ||
+      !ParseStatFile(
+          context->system_readers[SystemReader::kCpuTemperature].get(),
+          kCpuTempInfoColumns, &context->current_frame.cpu_temperature)) {
+    context->current_frame.cpu_temperature = std::numeric_limits<int>::min();
+    static bool error_reported = false;
+    if (!error_reported) {
+      LOG(ERROR) << "Failed to read cpu temperature : "
+                 << GetCpuTemperaturePathOnFileThread();
+      error_reported = true;
+    }
   }
 
-  return current_frame;
+  return context;
 }
 
 void ArcSystemStatCollector::UpdateSystemStatOnUiThread(
-    RuntimeFrame current_frame) {
-  DCHECK(request_scheduled_);
-  request_scheduled_ = false;
+    std::unique_ptr<SystemReadersContext> context) {
+  DCHECK(!context_ && context);
   DCHECK(!samples_.empty());
   Sample& current_sample = samples_[write_index_ % samples_.size()];
   current_sample.timestamp = base::TimeTicks::Now();
-  current_sample.mem_total_kb = current_frame.mem_info[0];
-  // Total - available.
+  current_sample.mem_total_kb = context->current_frame.mem_info[0];
+  // kTotal - available.
   current_sample.mem_used_kb =
-      current_frame.mem_info[0] - current_frame.mem_info[1];
-  current_sample.gem_objects = current_frame.gem_info[0];
-  current_sample.gem_size_kb = current_frame.gem_info[1] / 1024;
+      context->current_frame.mem_info[0] - context->current_frame.mem_info[1];
+  current_sample.gem_objects = context->current_frame.gem_info[0];
+  current_sample.gem_size_kb = context->current_frame.gem_info[1] / 1024;
 
   // We calculate delta, so ignore first update.
   if (write_index_) {
     current_sample.swap_sectors_read =
-        current_frame.zram_stat[0] - previous_frame_.zram_stat[0];
+        context->current_frame.zram_stat[0] - previous_frame_.zram_stat[0];
     current_sample.swap_sectors_write =
-        current_frame.zram_stat[1] - previous_frame_.zram_stat[1];
+        context->current_frame.zram_stat[1] - previous_frame_.zram_stat[1];
     current_sample.swap_waiting_time_ms =
-        current_frame.zram_stat[2] - previous_frame_.zram_stat[2];
+        context->current_frame.zram_stat[2] - previous_frame_.zram_stat[2];
   }
-  current_sample.cpu_temperature = current_frame.cpu_temperature_;
+  current_sample.cpu_temperature = context->current_frame.cpu_temperature;
   DCHECK_GE(current_sample.swap_sectors_read, 0);
   DCHECK_GE(current_sample.swap_sectors_write, 0);
   DCHECK_GE(current_sample.swap_waiting_time_ms, 0);
   DCHECK_GE(current_sample.mem_total_kb, 0);
   DCHECK_GE(current_sample.mem_used_kb, 0);
-  previous_frame_ = current_frame;
+  previous_frame_ = context->current_frame;
   ++write_index_;
+
+  context_ = std::move(context);
 }
 
-bool ParseStatFile(const base::FilePath& path,
-                   const int* columns,
-                   int64_t* output) {
+bool ParseStatFile(int fd, const int* columns, int64_t* output) {
   char buffer[128];
-  const int read = base::ReadFile(path, buffer, sizeof(buffer) - 1);
-  if (read < 0)
+  if (lseek(fd, 0, SEEK_SET))
     return false;
-  buffer[read] = 0;
+  const int read_bytes = read(fd, buffer, sizeof(buffer) - 1);
+  if (read_bytes < 0)
+    return false;
+  buffer[read_bytes] = 0;
   int column_index = 0;
   const char* scan = buffer;
   while (true) {
diff --git a/chrome/browser/chromeos/arc/tracing/arc_system_stat_collector.h b/chrome/browser/chromeos/arc/tracing/arc_system_stat_collector.h
index 258ddd4..29b92d0e 100644
--- a/chrome/browser/chromeos/arc/tracing/arc_system_stat_collector.h
+++ b/chrome/browser/chromeos/arc/tracing/arc_system_stat_collector.h
@@ -14,7 +14,6 @@
 #include "base/timer/timer.h"
 
 namespace base {
-class FilePath;
 class TimeDelta;
 class SequencedTaskRunner;
 }  // namespace base
@@ -85,6 +84,7 @@
 
  private:
   struct Sample;
+  struct SystemReadersContext;
 
   struct RuntimeFrame {
     // read, written sectors and total time in milliseconds.
@@ -94,22 +94,31 @@
     // objects, used bytes.
     int64_t gem_info[base::size(kGemInfoColumns) - 1] = {0};
     // Temperature of CPU, Core 0.
-    int64_t cpu_temperature_ = std::numeric_limits<int>::min();
+    int64_t cpu_temperature = std::numeric_limits<int>::min();
   };
 
-  // Schedule reading System stat files in |ReadSystemStatOnBackgroundThread| on
-  // background thread. Once ready result is passed to
+  // Schedules reading System stat files in |ReadSystemStatOnBackgroundThread|
+  // on background thread. Once ready result is passed to
   // |UpdateSystemStatOnUiThread|
   void ScheduleSystemStatUpdate();
-  static RuntimeFrame ReadSystemStatOnBackgroundThread();
-  void UpdateSystemStatOnUiThread(RuntimeFrame current_frame);
+
+  // Frees |context_| if it exists.
+  void FreeSystemReadersContext();
+
+  // Called when |SystemReadersContext| is initialized.
+  void OnInitOnUiThread(std::unique_ptr<SystemReadersContext> context);
+
+  // Reads system stat files on background thread using |context|.
+  static std::unique_ptr<SystemReadersContext> ReadSystemStatOnBackgroundThread(
+      std::unique_ptr<SystemReadersContext> context);
+  // Processes filled |current_frame_| on UI thread.
+  void UpdateSystemStatOnUiThread(
+      std::unique_ptr<SystemReadersContext> context);
 
   // To schedule updates of system stat.
   base::RepeatingTimer timer_;
   // Performs reading kernel stat files on backgrond thread.
   scoped_refptr<base::SequencedTaskRunner> background_task_runner_;
-  // Use to prevent double scheduling.
-  bool request_scheduled_ = false;
   // Used to limit the number of warnings printed in case System stat update is
   // dropped due to previous update is in progress.
   int missed_update_warning_left_ = 0;
@@ -121,6 +130,8 @@
   // Used to calculate delta.
   RuntimeFrame previous_frame_;
 
+  std::unique_ptr<SystemReadersContext> context_;
+
   base::WeakPtrFactory<ArcSystemStatCollector> weak_ptr_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(ArcSystemStatCollector);
@@ -128,12 +139,10 @@
 
 // Helper that reads and parses stat file containing decimal number separated by
 // whitespace and text fields. It does not have any dynamic memory allocation.
-// |path| specifies the file to read and parse. |columns| contains index of
-// column to parse, end of sequence is specified by terminator -1. |output|
-// receives parsed value. Must be the size as |columns| size - 1.
-bool ParseStatFile(const base::FilePath& path,
-                   const int* columns,
-                   int64_t* output);
+// |fd| specifies the file descriptor to read and parse. |columns| contains
+// index of column to parse, end of sequence is specified by terminator -1.
+// |output| receives parsed value. Must be the size as |columns| size - 1.
+bool ParseStatFile(int fd, const int* columns, int64_t* output);
 
 }  // namespace arc
 
diff --git a/chrome/browser/chromeos/arc/tracing/arc_system_stat_collector_unittest.cc b/chrome/browser/chromeos/arc/tracing/arc_system_stat_collector_unittest.cc
index acc8181..9c80bbf 100644
--- a/chrome/browser/chromeos/arc/tracing/arc_system_stat_collector_unittest.cc
+++ b/chrome/browser/chromeos/arc/tracing/arc_system_stat_collector_unittest.cc
@@ -4,7 +4,12 @@
 
 #include "chrome/browser/chromeos/arc/tracing/arc_system_stat_collector.h"
 
+#include <fcntl.h>
+#include <sys/types.h>
+#include <unistd.h>
+
 #include "base/files/file_path.h"
+#include "base/files/scoped_file.h"
 #include "base/path_service.h"
 #include "chrome/common/chrome_paths.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -15,17 +20,21 @@
 
 namespace {
 
-base::FilePath GetPath(const std::string& name) {
+base::ScopedFD OpenTestStatFile(const std::string& name) {
   base::FilePath base_path;
   base::PathService::Get(chrome::DIR_TEST_DATA, &base_path);
-  return base_path.Append("arc_graphics_tracing").Append(name);
+  const base::FilePath path =
+      base_path.Append("arc_graphics_tracing").Append(name);
+  base::ScopedFD result(open(path.value().c_str(), O_RDONLY));
+  DCHECK_GE(result.get(), 0);
+  return result;
 }
 
 }  // namespace
 
 TEST_F(ArcSystemStatCollectorTest, Parse) {
   int64_t zram_values[3];
-  EXPECT_TRUE(ParseStatFile(GetPath("zram_stat"),
+  EXPECT_TRUE(ParseStatFile(OpenTestStatFile("zram_stat").get(),
                             ArcSystemStatCollector::kZramStatColumns,
                             zram_values));
   EXPECT_EQ(2384, zram_values[0]);
@@ -33,21 +42,21 @@
   EXPECT_EQ(79, zram_values[2]);
 
   int64_t mem_values[2];
-  EXPECT_TRUE(ParseStatFile(GetPath("proc_meminfo"),
+  EXPECT_TRUE(ParseStatFile(OpenTestStatFile("proc_meminfo").get(),
                             ArcSystemStatCollector::kMemInfoColumns,
                             mem_values));
   EXPECT_EQ(8058940, mem_values[0]);
   EXPECT_EQ(2714260, mem_values[1]);
 
   int64_t gem_values[2];
-  EXPECT_TRUE(ParseStatFile(GetPath("gem_objects"),
+  EXPECT_TRUE(ParseStatFile(OpenTestStatFile("gem_objects").get(),
                             ArcSystemStatCollector::kGemInfoColumns,
                             gem_values));
   EXPECT_EQ(853, gem_values[0]);
   EXPECT_EQ(458256384, gem_values[1]);
 
   int64_t cpu_temp;
-  EXPECT_TRUE(ParseStatFile(GetPath("temp1_input"),
+  EXPECT_TRUE(ParseStatFile(OpenTestStatFile("temp1_input").get(),
                             ArcSystemStatCollector::kCpuTempInfoColumns,
                             &cpu_temp));
   EXPECT_EQ(52000, cpu_temp);
diff --git a/chrome/browser/chromeos/bluetooth/debug_logs_manager_factory.cc b/chrome/browser/chromeos/bluetooth/debug_logs_manager_factory.cc
index 9ef7fb42..ae31084 100644
--- a/chrome/browser/chromeos/bluetooth/debug_logs_manager_factory.cc
+++ b/chrome/browser/chromeos/bluetooth/debug_logs_manager_factory.cc
@@ -65,3 +65,7 @@
 
   return new DebugLogsManagerService(profile);
 }
+
+bool DebugLogsManagerFactory::ServiceIsCreatedWithBrowserContext() const {
+  return true;
+}
diff --git a/chrome/browser/chromeos/bluetooth/debug_logs_manager_factory.h b/chrome/browser/chromeos/bluetooth/debug_logs_manager_factory.h
index 4e73af7..2c343db 100644
--- a/chrome/browser/chromeos/bluetooth/debug_logs_manager_factory.h
+++ b/chrome/browser/chromeos/bluetooth/debug_logs_manager_factory.h
@@ -26,6 +26,7 @@
   // BrowserContextKeyedServiceFactory:
   KeyedService* BuildServiceInstanceFor(
       content::BrowserContext* context) const override;
+  bool ServiceIsCreatedWithBrowserContext() const override;
 
   DISALLOW_COPY_AND_ASSIGN(DebugLogsManagerFactory);
 };
diff --git a/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher.cc b/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher.cc
index 3c2283b..8e848f2 100644
--- a/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher.cc
+++ b/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher.cc
@@ -44,9 +44,4 @@
   event_router_->BroadcastEvent(std::move(event));
 }
 
-void PrintJobFinishedEventDispatcher::SetEventRouterForTesting(
-    EventRouter* event_router) {
-  event_router_ = event_router;
-}
-
 }  // namespace extensions
diff --git a/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher.h b/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher.h
index c2d5d8ed..50774cb 100644
--- a/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher.h
+++ b/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher.h
@@ -39,8 +39,6 @@
   void OnPrintJobFinished(
       const chromeos::printing::proto::PrintJobInfo& print_job_info) override;
 
-  void SetEventRouterForTesting(EventRouter* event_router);
-
  private:
   // Needed for BrowserContextKeyedAPI implementation.
   friend class BrowserContextKeyedAPIFactory<PrintJobFinishedEventDispatcher>;
diff --git a/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher_unittest.cc b/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher_unittest.cc
new file mode 100644
index 0000000..ee14fd3d
--- /dev/null
+++ b/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher_unittest.cc
@@ -0,0 +1,143 @@
+// 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/extensions/printing_metrics/print_job_finished_event_dispatcher.h"
+
+#include <memory>
+
+#include "base/bind.h"
+#include "base/values.h"
+#include "chrome/browser/chromeos/printing/history/mock_print_job_history_service.h"
+#include "chrome/browser/chromeos/printing/history/print_job_history_service_factory.h"
+#include "chrome/browser/chromeos/printing/history/print_job_info.pb.h"
+#include "chrome/browser/chromeos/printing/history/test_print_job_history_service_observer.h"
+#include "chrome/common/chrome_constants.h"
+#include "chrome/common/extensions/api/printing_metrics.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 "content/public/test/browser_task_environment.h"
+#include "content/public/test/test_service_manager_context.h"
+#include "extensions/browser/event_router.h"
+#include "extensions/browser/event_router_factory.h"
+#include "extensions/browser/test_event_router_observer.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+std::unique_ptr<extensions::api::printing_metrics::PrintJobInfo>
+GetPrintJobFinishedEventValue(
+    const extensions::TestEventRouterObserver* observer) {
+  const auto& event_map = observer->events();
+  auto iter = event_map.find(
+      extensions::api::printing_metrics::OnPrintJobFinished::kEventName);
+  if (iter == event_map.end())
+    return nullptr;
+
+  const extensions::Event& event = *iter->second;
+  if (!event.event_args || !event.event_args->is_list() ||
+      event.event_args->GetList().size() != 1u) {
+    ADD_FAILURE() << "Invalid event args";
+    return nullptr;
+  }
+
+  return extensions::api::printing_metrics::PrintJobInfo::FromValue(
+      event.event_args->GetList()[0]);
+}
+
+// Creates a new MockPrintJobHistoryService for the given |context|.
+std::unique_ptr<KeyedService> BuildPrintJobHistoryService(
+    content::BrowserContext* context) {
+  return std::make_unique<chromeos::MockPrintJobHistoryService>();
+}
+
+// Creates a new EventRouter for the given |context|.
+std::unique_ptr<KeyedService> BuildEventRouter(
+    content::BrowserContext* context) {
+  return std::make_unique<extensions::EventRouter>(context, nullptr);
+}
+
+}  // namespace
+
+namespace extensions {
+
+class PrintJobFinishedEventDispatcherUnittest : public testing::Test {
+ public:
+  PrintJobFinishedEventDispatcherUnittest() {}
+  ~PrintJobFinishedEventDispatcherUnittest() override = default;
+
+  void SetUp() override {
+    profile_manager_ = std::make_unique<TestingProfileManager>(
+        TestingBrowserProcess::GetGlobal());
+    ASSERT_TRUE(profile_manager_->SetUp());
+    testing_profile_ =
+        profile_manager_->CreateTestingProfile(chrome::kInitialProfile);
+
+    chromeos::PrintJobHistoryServiceFactory::GetInstance()->SetTestingFactory(
+        testing_profile_, base::BindRepeating(&BuildPrintJobHistoryService));
+
+    EventRouterFactory::GetInstance()->SetTestingFactory(
+        testing_profile_, base::BindRepeating(&BuildEventRouter));
+
+    dispatcher_ =
+        std::make_unique<PrintJobFinishedEventDispatcher>(testing_profile_);
+    observer_ = std::make_unique<TestEventRouterObserver>(
+        EventRouter::Get(testing_profile_));
+  }
+
+  void TearDown() override {
+    observer_.reset();
+    dispatcher_.reset();
+
+    testing_profile_ = nullptr;
+    profile_manager_->DeleteTestingProfile(chrome::kInitialProfile);
+  }
+
+ protected:
+  content::BrowserTaskEnvironment task_environment_;
+  content::TestServiceManagerContext service_manager_context_;
+  TestingProfile* testing_profile_;
+  std::unique_ptr<TestEventRouterObserver> observer_;
+
+ private:
+  std::unique_ptr<TestingProfileManager> profile_manager_;
+  std::unique_ptr<PrintJobFinishedEventDispatcher> dispatcher_;
+
+  DISALLOW_COPY_AND_ASSIGN(PrintJobFinishedEventDispatcherUnittest);
+};
+
+// Test that |OnPrintJobFinished| is dispatched when the print job is saved by
+// PrintJobHistoryService.
+TEST_F(PrintJobFinishedEventDispatcherUnittest, EventIsDispatched) {
+  constexpr char kTitle[] = "title";
+  constexpr int kPagesNumber = 3;
+
+  base::RunLoop run_loop;
+  chromeos::MockPrintJobHistoryService* print_job_history_service =
+      static_cast<chromeos::MockPrintJobHistoryService*>(
+          chromeos::PrintJobHistoryServiceFactory::GetForBrowserContext(
+              testing_profile_));
+  chromeos::TestPrintJobHistoryServiceObserver observer(
+      print_job_history_service, run_loop.QuitWhenIdleClosure());
+
+  chromeos::printing::proto::PrintJobInfo print_job_info_proto;
+  print_job_info_proto.set_title(kTitle);
+  print_job_info_proto.set_status(
+      chromeos::printing::proto::PrintJobInfo_PrintJobStatus_FAILED);
+  print_job_info_proto.set_number_of_pages(kPagesNumber);
+  print_job_history_service->SavePrintJobProto(print_job_info_proto);
+  run_loop.Run();
+
+  // As soon as Run() is completed all PrintJobHistoryService observers are
+  // called and event is expected to appear in the |observer_|.
+  std::unique_ptr<extensions::api::printing_metrics::PrintJobInfo>
+      print_job_info = GetPrintJobFinishedEventValue(observer_.get());
+  ASSERT_TRUE(print_job_info);
+  EXPECT_EQ(kTitle, print_job_info->title);
+  EXPECT_EQ(extensions::api::printing_metrics::PRINT_JOB_STATUS_FAILED,
+            print_job_info->status);
+  EXPECT_EQ(kPagesNumber, print_job_info->number_of_pages);
+}
+
+}  // namespace extensions
diff --git a/chrome/browser/chromeos/extensions/printing_metrics/printing_metrics_api_unittest.cc b/chrome/browser/chromeos/extensions/printing_metrics/printing_metrics_api_unittest.cc
new file mode 100644
index 0000000..5493c85
--- /dev/null
+++ b/chrome/browser/chromeos/extensions/printing_metrics/printing_metrics_api_unittest.cc
@@ -0,0 +1,159 @@
+// 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/extensions/printing_metrics/printing_metrics_api.h"
+
+#include "chrome/browser/chromeos/printing/history/mock_print_job_history_service.h"
+#include "chrome/browser/chromeos/printing/history/print_job_history_service_factory.h"
+#include "chrome/browser/chromeos/printing/history/print_job_info.pb.h"
+#include "chrome/browser/extensions/extension_api_unittest.h"
+#include "chrome/common/extensions/api/printing_metrics.h"
+#include "extensions/browser/api_test_utils.h"
+#include "extensions/common/extension.h"
+#include "extensions/common/extension_builder.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using chromeos::printing::proto::PrintJobInfo;
+
+namespace extensions {
+
+namespace {
+
+constexpr char kTitle1[] = "title1";
+constexpr char kTitle2[] = "title2";
+
+constexpr int kPagesNumber = 3;
+
+// Creates a new MockPrintJobHistoryService for the given |context|.
+std::unique_ptr<KeyedService> BuildPrintJobHistoryService(
+    content::BrowserContext* context) {
+  return std::make_unique<chromeos::MockPrintJobHistoryService>();
+}
+
+void ReturnNoPrintJobs(
+    chromeos::PrintJobDatabase::GetPrintJobsCallback callback) {
+  std::move(callback).Run(true, std::make_unique<std::vector<PrintJobInfo>>());
+}
+
+void ReturnOnePrintJob(
+    chromeos::PrintJobDatabase::GetPrintJobsCallback callback) {
+  chromeos::printing::proto::PrintJobInfo print_job_info_proto;
+  print_job_info_proto.set_title(kTitle1);
+  print_job_info_proto.set_status(
+      chromeos::printing::proto::PrintJobInfo_PrintJobStatus_FAILED);
+  print_job_info_proto.set_number_of_pages(kPagesNumber);
+  std::move(callback).Run(true,
+                          std::make_unique<std::vector<PrintJobInfo>>(
+                              std::vector<PrintJobInfo>{print_job_info_proto}));
+}
+
+void ReturnTwoPrintJobs(
+    chromeos::PrintJobDatabase::GetPrintJobsCallback callback) {
+  chromeos::printing::proto::PrintJobInfo print_job_info_proto1;
+  print_job_info_proto1.set_title(kTitle1);
+  print_job_info_proto1.set_status(
+      chromeos::printing::proto::PrintJobInfo_PrintJobStatus_FAILED);
+  print_job_info_proto1.set_number_of_pages(kPagesNumber);
+  chromeos::printing::proto::PrintJobInfo print_job_info_proto2;
+  print_job_info_proto2.set_title(kTitle2);
+  std::move(callback).Run(
+      true,
+      std::make_unique<std::vector<PrintJobInfo>>(std::vector<PrintJobInfo>{
+          print_job_info_proto1, print_job_info_proto2}));
+}
+
+}  // namespace
+
+class PrintingMetricsApiUnittest : public ExtensionApiUnittest {
+ public:
+  PrintingMetricsApiUnittest() {}
+  ~PrintingMetricsApiUnittest() override = default;
+
+  void SetUp() override {
+    ExtensionApiUnittest::SetUp();
+    scoped_refptr<const Extension> extension =
+        ExtensionBuilder(/*name=*/"printingMetrics API extension")
+            .SetID("abcdefghijklmnopqrstuvwxyzabcdef")
+            .Build();
+    set_extension(extension);
+
+    chromeos::PrintJobHistoryServiceFactory::GetInstance()->SetTestingFactory(
+        browser()->profile(),
+        base::BindRepeating(&BuildPrintJobHistoryService));
+  }
+
+ protected:
+  using GetPrintJobsCallback =
+      void (*)(chromeos::PrintJobDatabase::GetPrintJobsCallback);
+
+  void SetUpMockPrintJobHistoryService(GetPrintJobsCallback callback) {
+    chromeos::MockPrintJobHistoryService* print_job_history_service =
+        static_cast<chromeos::MockPrintJobHistoryService*>(
+            chromeos::PrintJobHistoryServiceFactory::GetForBrowserContext(
+                browser()->profile()));
+    EXPECT_CALL(*print_job_history_service, GetPrintJobs(testing::_))
+        .WillOnce(testing::Invoke(callback));
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(PrintingMetricsApiUnittest);
+};
+
+// Test that calling |printingMetrics.getPrintJobs()| returns no print jobs.
+TEST_F(PrintingMetricsApiUnittest, GetPrintJobs_NoPrintJobs) {
+  SetUpMockPrintJobHistoryService(ReturnNoPrintJobs);
+
+  auto function = base::MakeRefCounted<PrintingMetricsGetPrintJobsFunction>();
+  std::unique_ptr<base::Value> result =
+      RunFunctionAndReturnValue(function.get(), "[]");
+
+  ASSERT_TRUE(result);
+  ASSERT_TRUE(result->is_list());
+  EXPECT_TRUE(result->GetList().empty());
+}
+
+// Test that calling |printingMetrics.getPrintJobs()| returns the mock print
+// job.
+TEST_F(PrintingMetricsApiUnittest, GetPrintJobs_OnePrintJob) {
+  SetUpMockPrintJobHistoryService(ReturnOnePrintJob);
+
+  auto function = base::MakeRefCounted<PrintingMetricsGetPrintJobsFunction>();
+  std::unique_ptr<base::Value> result =
+      RunFunctionAndReturnValue(function.get(), "[]");
+
+  ASSERT_TRUE(result);
+  ASSERT_TRUE(result->is_list());
+  ASSERT_EQ(1u, result->GetList().size());
+  std::unique_ptr<api::printing_metrics::PrintJobInfo> print_job_info =
+      api::printing_metrics::PrintJobInfo::FromValue(result->GetList()[0]);
+  EXPECT_TRUE(print_job_info);
+  EXPECT_EQ(kTitle1, print_job_info->title);
+  EXPECT_EQ(api::printing_metrics::PRINT_JOB_STATUS_FAILED,
+            print_job_info->status);
+  EXPECT_EQ(kPagesNumber, print_job_info->number_of_pages);
+}
+
+// Test that calling |printingMetrics.getPrintJobs()| returns both mock print
+// jobs.
+TEST_F(PrintingMetricsApiUnittest, GetPrintJobs_TwoPrintJobs) {
+  SetUpMockPrintJobHistoryService(ReturnTwoPrintJobs);
+
+  auto function = base::MakeRefCounted<PrintingMetricsGetPrintJobsFunction>();
+  std::unique_ptr<base::Value> result =
+      RunFunctionAndReturnValue(function.get(), "[]");
+
+  ASSERT_TRUE(result);
+  ASSERT_TRUE(result->is_list());
+  ASSERT_EQ(2u, result->GetList().size());
+  std::unique_ptr<api::printing_metrics::PrintJobInfo> print_job_info1 =
+      api::printing_metrics::PrintJobInfo::FromValue(result->GetList()[0]);
+  EXPECT_TRUE(print_job_info1);
+  EXPECT_EQ(kTitle1, print_job_info1->title);
+  std::unique_ptr<api::printing_metrics::PrintJobInfo> print_job_info2 =
+      api::printing_metrics::PrintJobInfo::FromValue(result->GetList()[1]);
+  EXPECT_TRUE(print_job_info2);
+  EXPECT_EQ(kTitle2, print_job_info2->title);
+}
+
+}  // namespace extensions
diff --git a/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc b/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc
index d460bfdc..27d045c 100644
--- a/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc
+++ b/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc
@@ -12,6 +12,7 @@
 #include "base/test/scoped_feature_list.h"
 #include "base/values.h"
 #include "build/branding_buildflags.h"
+#include "build/buildflag.h"
 #include "chrome/browser/chromeos/arc/arc_service_launcher.h"
 #include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.h"
@@ -40,6 +41,7 @@
 #include "chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h"
+#include "chromeos/assistant/buildflags.h"
 #include "chromeos/constants/chromeos_features.h"
 #include "chromeos/constants/chromeos_switches.h"
 #include "chromeos/dbus/update_engine_client.h"
@@ -279,6 +281,10 @@
 // screen is shown, and how the setup progresses after the screen. The actual
 // assistant opt-in flow is tested separately.
 void HandleAssistantOptInScreen() {
+#if !BUILDFLAG(ENABLE_CROS_LIBASSISTANT)
+  return;
+#endif
+
   OobeScreenWaiter(AssistantOptInFlowScreenView::kScreenId).Wait();
   LOG(INFO) << "OobeInteractiveUITest: Switched to 'assistant-optin' screen.";
 
diff --git a/chrome/browser/chromeos/login/screens/error_screen.cc b/chrome/browser/chromeos/login/screens/error_screen.cc
index 31813598..534ae46 100644
--- a/chrome/browser/chromeos/login/screens/error_screen.cc
+++ b/chrome/browser/chromeos/login/screens/error_screen.cc
@@ -164,6 +164,11 @@
     view_->SetShowConnectingIndicator(show);
 }
 
+void ErrorScreen::SetIsPersistentError(bool is_persistent) {
+  if (view_)
+    view_->SetIsPersistentError(is_persistent);
+}
+
 ErrorScreen::ConnectRequestCallbackSubscription
 ErrorScreen::RegisterConnectRequestCallback(const base::Closure& callback) {
   return connect_request_callbacks_.Add(callback);
diff --git a/chrome/browser/chromeos/login/screens/error_screen.h b/chrome/browser/chromeos/login/screens/error_screen.h
index 1d87f12..9c6d803 100644
--- a/chrome/browser/chromeos/login/screens/error_screen.h
+++ b/chrome/browser/chromeos/login/screens/error_screen.h
@@ -94,6 +94,9 @@
   // Toggles the connection pending indicator.
   void ShowConnectingIndicator(bool show);
 
+  // Makes error persistent (e.g. non-closable).
+  void SetIsPersistentError(bool is_persistent);
+
   // Register a callback to be invoked when the user indicates that an attempt
   // to connect to the network should be made.
   ConnectRequestCallbackSubscription RegisterConnectRequestCallback(
diff --git a/chrome/browser/chromeos/login/screens/mock_error_screen.h b/chrome/browser/chromeos/login/screens/mock_error_screen.h
index 6537e12..8b1f7759 100644
--- a/chrome/browser/chromeos/login/screens/mock_error_screen.h
+++ b/chrome/browser/chromeos/login/screens/mock_error_screen.h
@@ -48,6 +48,7 @@
   MOCK_METHOD1(SetOfflineSigninAllowed, void(bool value));
   MOCK_METHOD1(SetShowConnectingIndicator, void(bool value));
   MOCK_METHOD1(SetUIState, void(NetworkError::UIState ui_state));
+  MOCK_METHOD1(SetIsPersistentError, void(bool is_persistent));
 
  private:
   ErrorScreen* screen_ = nullptr;
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc
index e00d22d..45b97d1 100644
--- a/chrome/browser/chromeos/login/wizard_controller.cc
+++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -30,6 +30,7 @@
 #include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/branding_buildflags.h"
+#include "build/buildflag.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part.h"
 #include "chrome/browser/chrome_notification_types.h"
@@ -127,6 +128,7 @@
 #include "chrome/browser/ui/webui/help/help_utils_chromeos.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/pref_names.h"
+#include "chromeos/assistant/buildflags.h"
 #include "chromeos/audio/cras_audio_handler.h"
 #include "chromeos/constants/chromeos_constants.h"
 #include "chromeos/constants/chromeos_features.h"
@@ -685,8 +687,12 @@
 }
 
 void WizardController::ShowAssistantOptInFlowScreen() {
+#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT)
   UpdateStatusAreaVisibilityForScreen(AssistantOptInFlowScreenView::kScreenId);
   SetCurrentScreen(GetScreen(AssistantOptInFlowScreenView::kScreenId));
+#else
+  ShowMultiDeviceSetupScreen();
+#endif
 }
 
 void WizardController::ShowMultiDeviceSetupScreen() {
diff --git a/chrome/browser/chromeos/policy/app_install_event_log.cc b/chrome/browser/chromeos/policy/app_install_event_log.cc
index fe788dd..6545d739 100644
--- a/chrome/browser/chromeos/policy/app_install_event_log.cc
+++ b/chrome/browser/chromeos/policy/app_install_event_log.cc
@@ -9,6 +9,7 @@
 
 #include <algorithm>
 #include <memory>
+#include <utility>
 
 #include "base/files/file.h"
 #include "base/logging.h"
@@ -20,20 +21,19 @@
 namespace policy {
 
 namespace {
-static const int64_t kLogFileVersion = 3;
-static const ssize_t kMaxLogs = 1024;
+constexpr int64_t kLogFileVersion = 3;
+constexpr ssize_t kMaxLogs = 1024;
 }  // namespace
 
 AppInstallEventLog::AppInstallEventLog(const base::FilePath& file_name)
     : file_name_(file_name) {
   base::File file(file_name_, base::File::FLAG_OPEN | base::File::FLAG_READ);
-  if (!file.IsValid()) {
+  if (!file.IsValid())
     return;
-  }
 
   int64_t version;
-  if (file.ReadAtCurrentPos(reinterpret_cast<char*>(&version),
-                            sizeof(version)) != sizeof(version)) {
+  if (!file.ReadAtCurrentPosAndCheck(
+          base::as_writable_bytes(base::make_span(&version, 1)))) {
     LOG(WARNING) << "Corrupted app install log.";
     return;
   }
@@ -44,8 +44,8 @@
   }
 
   ssize_t entries;
-  if (file.ReadAtCurrentPos(reinterpret_cast<char*>(&entries),
-                            sizeof(entries)) != sizeof(entries)) {
+  if (!file.ReadAtCurrentPosAndCheck(
+          base::as_writable_bytes(base::make_span(&entries, 1)))) {
     LOG(WARNING) << "Corrupted app install log.";
     return;
   }
@@ -73,7 +73,7 @@
   }
 }
 
-AppInstallEventLog::~AppInstallEventLog() {}
+AppInstallEventLog::~AppInstallEventLog() = default;
 
 void AppInstallEventLog::Add(const std::string& package,
                              const em::AppInstallReportLogEvent& event) {
@@ -83,9 +83,8 @@
   }
 
   auto& log = logs_[package];
-  if (log == nullptr) {
-    log.reset(new SingleAppInstallEventLog(package));
-  }
+  if (!log)
+    log = std::make_unique<SingleAppInstallEventLog>(package);
   total_size_ -= log->size();
   log->Add(event);
   total_size_ += log->size();
@@ -105,16 +104,15 @@
     return;
   }
 
-  if (file.WriteAtCurrentPos(reinterpret_cast<const char*>(&kLogFileVersion),
-                             sizeof(kLogFileVersion)) !=
-      sizeof(kLogFileVersion)) {
+  if (!file.WriteAtCurrentPosAndCheck(
+          base::as_bytes(base::make_span(&kLogFileVersion, 1)))) {
     LOG(WARNING) << "Unable to store app install log.";
     return;
   }
 
   ssize_t entries = logs_.size();
-  if (file.WriteAtCurrentPos(reinterpret_cast<const char*>(&entries),
-                             sizeof(entries)) != sizeof(entries)) {
+  if (!file.WriteAtCurrentPosAndCheck(
+          base::as_bytes(base::make_span(&entries, 1)))) {
     LOG(WARNING) << "Unable to store app install log.";
     return;
   }
diff --git a/chrome/browser/download/image_thumbnail_request.cc b/chrome/browser/download/image_thumbnail_request.cc
index 22e0b7fd..8a373a3 100644
--- a/chrome/browser/download/image_thumbnail_request.cc
+++ b/chrome/browser/download/image_thumbnail_request.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/download/image_thumbnail_request.h"
 
 #include <memory>
+#include <utility>
 
 #include "base/bind.h"
 #include "base/files/file_util.h"
@@ -25,40 +26,37 @@
 // Ignore image files that are too large to avoid long delays.
 const int64_t kMaxImageSize = 10 * 1024 * 1024;  // 10 MB
 
-std::string LoadImageData(const base::FilePath& path) {
+std::vector<uint8_t> LoadImageData(const base::FilePath& path) {
   base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
                                                 base::BlockingType::WILL_BLOCK);
 
+  std::vector<uint8_t> data;
   // Confirm that the file's size is within our threshold.
   base::File file;
 #if defined(OS_ANDROID)
   if (path.IsContentUri()) {
     file = base::OpenContentUriForRead(path);
     if (!file.IsValid())
-      return std::string();
+      return data;
   }
 #endif  // defined(OS_ANDROID)
   if (!file.IsValid())
     file = base::File(path, base::File::FLAG_OPEN | base::File::FLAG_READ);
 
   if (!file.IsValid())
-    return std::string();
+    return data;
 
   int64_t file_size = file.GetLength();
-  if (file_size < 0 || file_size > kMaxImageSize) {
+  if (file_size <= 0 || file_size > kMaxImageSize) {
     LOG(ERROR) << "Unexpected file size: " << path.MaybeAsASCII() << ", "
                << file_size;
-    return std::string();
+    return data;
   }
 
-  std::string data;
   data.resize(file_size);
-  int read_bytes = file.Read(0, &data[0], data.size());
-
-  // Make sure the file isn't empty.
-  if (read_bytes < 0 || data.empty()) {
+  if (!file.ReadAndCheck(0, data)) {
     LOG(ERROR) << "Failed to read file: " << path.MaybeAsASCII();
-    return std::string();
+    data.clear();
   }
 
   return data;
@@ -100,7 +98,7 @@
   FinishRequest(SkBitmap());
 }
 
-void ImageThumbnailRequest::OnLoadComplete(const std::string& data) {
+void ImageThumbnailRequest::OnLoadComplete(const std::vector<uint8_t>& data) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   if (data.empty()) {
     FinishRequest(SkBitmap());
diff --git a/chrome/browser/download/image_thumbnail_request.h b/chrome/browser/download/image_thumbnail_request.h
index 4ff4029..05c5e0f 100644
--- a/chrome/browser/download/image_thumbnail_request.h
+++ b/chrome/browser/download/image_thumbnail_request.h
@@ -5,12 +5,15 @@
 #ifndef CHROME_BROWSER_DOWNLOAD_IMAGE_THUMBNAIL_REQUEST_H_
 #define CHROME_BROWSER_DOWNLOAD_IMAGE_THUMBNAIL_REQUEST_H_
 
-#include <string>
+#include <vector>
 
-#include "base/files/file_path.h"
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/image_decoder.h"
 
+namespace base {
+class FilePath;
+}
+
 // Helper class to generate thumbnail for a given local image file with a given
 // max size. Must be invoked on the browser thread.
 class ImageThumbnailRequest : public ImageDecoder::ImageRequest {
@@ -31,7 +34,7 @@
 
   void OnDecodeImageFailed() override;
 
-  void OnLoadComplete(const std::string& data);
+  void OnLoadComplete(const std::vector<uint8_t>& data);
 
   void FinishRequest(SkBitmap thumbnail);
 
diff --git a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
index b9a971f..50f513b 100644
--- a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
+++ b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
@@ -294,6 +294,7 @@
   }
 
   translate_prefs->AddToLanguageList(language_code, /*force_blocked=*/false);
+  translate_prefs->ResetRecentTargetLanguage();
 
   return RespondNow(NoArguments());
 }
@@ -327,6 +328,7 @@
   }
 
   translate_prefs->RemoveFromLanguageList(language_code);
+  translate_prefs->ResetRecentTargetLanguage();
 
   return RespondNow(NoArguments());
 }
@@ -356,6 +358,7 @@
   } else {
     translate_prefs->BlockLanguage(language_code);
   }
+  translate_prefs->ResetRecentTargetLanguage();
 
   return RespondNow(NoArguments());
 }
@@ -408,6 +411,7 @@
   const int offset = 1;
   translate_prefs->RearrangeLanguage(language_code, where, offset,
                                      supported_language_codes);
+  translate_prefs->ResetRecentTargetLanguage();
 
   return RespondNow(NoArguments());
 }
diff --git a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
index bd2cee0..e0b040b 100644
--- a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
+++ b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
@@ -630,85 +630,6 @@
 }
 
 // static
-bool ChromeContentBrowserClientExtensionsPart::ShouldAllowOpenURL(
-    content::SiteInstance* site_instance,
-    const GURL& to_url,
-    bool* result) {
-  DCHECK(result);
-
-  // Using url::Origin is important to properly handle blob: and filesystem:
-  // URLs.
-  url::Origin to_origin = url::Origin::Create(to_url);
-  if (to_origin.scheme() != kExtensionScheme) {
-    // We're not responsible for protecting this resource.  Note that hosted
-    // apps fall into this category.
-    return false;
-  }
-
-  // Do not allow pages from the web or other extensions navigate to
-  // non-web-accessible extension resources.
-
-  ExtensionRegistry* registry =
-      ExtensionRegistry::Get(site_instance->GetBrowserContext());
-  const Extension* to_extension =
-      registry->enabled_extensions().GetByID(to_origin.host());
-  if (!to_extension) {
-    // Treat non-existent extensions the same as an extension without accessible
-    // resources.
-    *result = false;
-    return true;
-  }
-
-  GURL site_url(site_instance->GetSiteURL());
-  const Extension* from_extension =
-      registry->enabled_extensions().GetExtensionOrAppByURL(site_url);
-  if (from_extension && from_extension == to_extension) {
-    *result = true;
-    return true;
-  }
-
-  // Blob and filesystem URLs are never considered web-accessible.  See
-  // https://crbug.com/656752.
-  if (to_url.SchemeIsFileSystem() || to_url.SchemeIsBlob()) {
-    *result = false;
-    return true;
-  }
-
-  // Navigations from chrome://, chrome-search:// and devtools:// pages
-  // need to be allowed, even if |to_url| is not web-accessible. See
-  // https://crbug.com/662602.
-  //
-  // Note that this is intentionally done after the check for blob: and
-  // filesystem: URLs above, for consistency with the renderer-side checks
-  // which already disallow navigations from chrome URLs to blob/filesystem
-  // URLs.
-  if (site_url.SchemeIs(content::kChromeUIScheme) ||
-      site_url.SchemeIs(content::kChromeDevToolsScheme) ||
-      site_url.SchemeIs(chrome::kChromeSearchScheme)) {
-    *result = true;
-    return true;
-  }
-
-  // <webview> guests should be allowed to load only webview-accessible
-  // resources, but that check is done later in
-  // AllowCrossRendererResourceLoadHelper, so allow <webview> guests to proceed
-  // here and rely on that check instead.  See https://crbug.com/691941.
-  if (site_url.SchemeIs(content::kGuestScheme)) {
-    *result = true;
-    return true;
-  }
-
-  if (WebAccessibleResourcesInfo::IsResourceWebAccessible(to_extension,
-                                                          to_url.path())) {
-    *result = true;
-    return true;
-  }
-
-  *result = false;
-  return true;
-}
-
-// static
 std::unique_ptr<content::VpnServiceProxy>
 ChromeContentBrowserClientExtensionsPart::GetVpnServiceProxy(
     content::BrowserContext* browser_context) {
diff --git a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.h b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.h
index c1941359..4fbcd34 100644
--- a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.h
+++ b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.h
@@ -85,12 +85,6 @@
       base::Optional<url::Origin>* initiator_origin);
   static std::vector<url::Origin> GetOriginsRequiringDedicatedProcess();
 
-  // Similiar to ChromeContentBrowserClient::ShouldAllowOpenURL(), but the
-  // return value indicates whether to use |result| or not.
-  static bool ShouldAllowOpenURL(content::SiteInstance* site_instance,
-                                 const GURL& to_url,
-                                 bool* result);
-
   // Helper function to call InfoMap::SetSigninProcess().
   static void SetSigninProcess(content::SiteInstance* site_instance);
 
diff --git a/chrome/browser/extensions/extension_resource_request_policy_apitest.cc b/chrome/browser/extensions/extension_resource_request_policy_apitest.cc
index 3b6858b..e493b31 100644
--- a/chrome/browser/extensions/extension_resource_request_policy_apitest.cc
+++ b/chrome/browser/extensions/extension_resource_request_policy_apitest.cc
@@ -9,6 +9,8 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "content/public/browser/navigation_controller.h"
+#include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/render_frame_host.h"
@@ -29,6 +31,47 @@
     host_resolver()->AddRule("*", "127.0.0.1");
     ASSERT_TRUE(embedded_test_server()->Start());
   }
+
+  void OpenUrlInSubFrameAndVerifyNavigationBlocked(
+      const GURL& target_url,
+      const std::string& target_frame_name,
+      const GURL& expected_navigation_url) {
+    GURL main_url = embedded_test_server()->GetURL(
+        "/frame_tree/page_with_two_frames_remote_and_local.html");
+    ui_test_utils::NavigateToURL(browser(), main_url);
+
+    // Navigate |target_frame_name| to |target_url|.
+    content::WebContents* web_contents =
+        browser()->tab_strip_model()->GetActiveWebContents();
+    content::TestNavigationObserver nav_observer(web_contents, 1);
+    ASSERT_TRUE(content::ExecJs(
+        web_contents, content::JsReplace("window.open($1, $2)", target_url,
+                                         target_frame_name)));
+    nav_observer.Wait();
+
+    // Verify that the navigation has failed.
+    //
+    // It is important that the failure mode below is the same in _all_ of the
+    // tests like (to prevent fingerprinting):
+    // - WebNavigationToNonWebAccessibleResource...
+    // - WebNavigationToNonExistentResource
+    // - WebNavigationToNonExistentExtension
+    // - ...
+    EXPECT_FALSE(nav_observer.last_navigation_succeeded());
+    EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, nav_observer.last_net_error_code());
+    EXPECT_EQ(expected_navigation_url, nav_observer.last_navigation_url());
+  }
+
+  void OpenUrlInLocalFrameAndVerifyNavigationBlocked(const GURL& target_url) {
+    // Tentatively check that the renderer-side validation took place.  Without
+    // renderer-side navigation we would still expect browser-side validation to
+    // result in ERR_BLOCKED_BY_CLIENT (with a different final URL though) -
+    // this is why the test assertion below is secondary / not that important.
+    GURL url_blocked_by_renderer("chrome-extension://invalid/");
+
+    OpenUrlInSubFrameAndVerifyNavigationBlocked(target_url, "local-frame",
+                                                url_blocked_by_renderer);
+  }
 };
 
 // Note, this mostly tests the logic of chrome/renderer/extensions/
@@ -220,6 +263,9 @@
       test_data_dir_.AppendASCII("extension_resource_request_policy")
           .AppendASCII("web_accessible"));
   ASSERT_TRUE(extension);
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  content::NavigationController& controller = web_contents->GetController();
 
   GURL accessible_linked_resource(embedded_test_server()->GetURL(
       "/extensions/api_test/extension_resource_request_policy/"
@@ -227,10 +273,14 @@
   ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
       browser(), accessible_linked_resource, 1);
   ASSERT_TRUE(content::ExecuteScriptAndExtractString(
-      browser()->tab_strip_model()->GetActiveWebContents(),
-      "window.domAutomationController.send(document.URL)",
+      web_contents, "window.domAutomationController.send(document.URL)",
       &result));
-  EXPECT_NE("about:blank", result);
+  EXPECT_EQ(content::PAGE_TYPE_NORMAL,
+            controller.GetLastCommittedEntry()->GetPageType());
+  GURL accessible_url = extension->GetResourceURL("/test.png");
+  EXPECT_EQ(accessible_url, result);
+  EXPECT_EQ(accessible_url,
+            web_contents->GetMainFrame()->GetLastCommittedURL());
 
   GURL nonaccessible_linked_resource(embedded_test_server()->GetURL(
       "/extensions/api_test/extension_resource_request_policy/"
@@ -238,15 +288,17 @@
   ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
       browser(), nonaccessible_linked_resource, 1);
   ASSERT_TRUE(content::ExecuteScriptAndExtractString(
-      browser()->tab_strip_model()->GetActiveWebContents(),
-      "window.domAutomationController.send(document.URL)",
+      web_contents, "window.domAutomationController.send(document.URL)",
       &result));
-  EXPECT_EQ("about:blank", result);
-
+  EXPECT_EQ(content::PAGE_TYPE_ERROR,
+            controller.GetLastCommittedEntry()->GetPageType());
+  EXPECT_EQ("chrome-error://chromewebdata/", result);
+  GURL nonaccessible_url = extension->GetResourceURL("/test2.png");
+  EXPECT_EQ(nonaccessible_url,
+            web_contents->GetMainFrame()->GetLastCommittedURL());
 
   // Redirects can sometimes occur before the load event, so use a
   // UrlLoadObserver instead of blocking waiting for two load events.
-  GURL accessible_url = extension->GetResourceURL("/test.png");
   ui_test_utils::UrlLoadObserver accessible_observer(
       accessible_url, content::NotificationService::AllSources());
   GURL accessible_client_redirect_resource(embedded_test_server()->GetURL(
@@ -254,23 +306,21 @@
       "web_accessible/accessible_redirect_resource.html"));
   ui_test_utils::NavigateToURL(browser(), accessible_client_redirect_resource);
   accessible_observer.Wait();
-  EXPECT_EQ(accessible_url, browser()
-                                ->tab_strip_model()
-                                ->GetActiveWebContents()
-                                ->GetLastCommittedURL());
+  EXPECT_EQ(content::PAGE_TYPE_NORMAL,
+            controller.GetLastCommittedEntry()->GetPageType());
+  EXPECT_EQ(accessible_url, web_contents->GetLastCommittedURL());
 
   ui_test_utils::UrlLoadObserver nonaccessible_observer(
-      GURL("about:blank"), content::NotificationService::AllSources());
+      nonaccessible_url, content::NotificationService::AllSources());
   GURL nonaccessible_client_redirect_resource(embedded_test_server()->GetURL(
       "/extensions/api_test/extension_resource_request_policy/"
       "web_accessible/nonaccessible_redirect_resource.html"));
   ui_test_utils::NavigateToURL(browser(),
                                nonaccessible_client_redirect_resource);
   nonaccessible_observer.Wait();
-  EXPECT_EQ(GURL("about:blank"), browser()
-                                     ->tab_strip_model()
-                                     ->GetActiveWebContents()
-                                     ->GetLastCommittedURL());
+  EXPECT_EQ(content::PAGE_TYPE_ERROR,
+            controller.GetLastCommittedEntry()->GetPageType());
+  EXPECT_EQ(nonaccessible_url, web_contents->GetLastCommittedURL());
 }
 
 IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest,
@@ -382,29 +432,53 @@
   const GURL non_web_accessible_url =
       extension->GetResourceURL("inaccessible-iframe-contents.html");
 
-  GURL main_url = embedded_test_server()->GetURL(
-      "/frame_tree/page_with_two_frames_remote_and_local.html");
-  ui_test_utils::NavigateToURL(browser(), main_url);
+  OpenUrlInLocalFrameAndVerifyNavigationBlocked(non_web_accessible_url);
+}
 
-  // Attempt to navigate the local frame to a non-web-accessible-resource.
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  content::TestNavigationObserver nav_observer(web_contents, 1);
-  ASSERT_TRUE(content::ExecJs(
-      web_contents, content::JsReplace("window.open($1, 'local-frame')",
-                                       non_web_accessible_url)));
-  nav_observer.Wait();
+// This test tries to ensure that there is no difference between
+// 1) navigating to a non-web-accessible-resource of an existing extension
+//    (tested by WebNavigationToNonWebAccessibleResource_... tests)
+// and
+// 2a) navigating to a non-existent resource of an existing extension
+//     (the WebNavigationToNonExistentResource test here)
+// and
+// 2b) navigating to a resource of a non-existent extension
+//     (the WebNavigationToNonExistentExtension test below)
+//
+// The lack of differences is important to prevent web pages from fingerprinting
+// (by making it difficult for web pages to detect which extensions are
+// present).
+IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest,
+                       WebNavigationToNonExistentResource) {
+  const Extension* extension = LoadExtension(
+      test_data_dir_.AppendASCII("extension_resource_request_policy")
+          .AppendASCII("inaccessible"));
+  ASSERT_TRUE(extension);
+  const GURL non_existent_resource_url =
+      extension->GetResourceURL("no-such-extension-resource.html");
 
-  // Verify that the navigation has failed.
-  EXPECT_FALSE(nav_observer.last_navigation_succeeded());
-  EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, nav_observer.last_net_error_code());
+  OpenUrlInLocalFrameAndVerifyNavigationBlocked(non_existent_resource_url);
+}
 
-  // Tentatively check that the renderer-side validation took place.  Without
-  // renderer-side navigation we would still expect browser-side validation to
-  // result in ERR_BLOCKED_BY_CLIENT (with a different final URL though) - this
-  // is why the test assertion below is secondary / not that important.
-  EXPECT_EQ(GURL("chrome-extension://invalid/"),
-            nav_observer.last_navigation_url());
+// This test tries to ensure that there is no difference between
+// 1) navigating to a non-web-accessible-resource of an existing extension
+//    (tested by WebNavigationToNonWebAccessibleResource_... tests)
+// and
+// 2a) navigating to a non-existent resource of an existing extension
+//     (the WebNavigationToNonExistentResource test above)
+// and
+// 2b) navigating to a resource of a non-existent extension
+//     (the WebNavigationToNonExistentExtension test here)
+//
+// The lack of differences is important to prevent web pages from fingerprinting
+// (by making it difficult for web pages to detect which extensions are
+// present).
+IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest,
+                       WebNavigationToNonExistentExtension) {
+  const GURL non_existent_extension_url(
+      "chrome-extension://aaaaabbbbbcccccdddddeeeeefffffgg/blah.png");
+
+  OpenUrlInLocalFrameAndVerifyNavigationBlocked(non_existent_extension_url);
 }
 
 IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest,
@@ -416,27 +490,8 @@
   const GURL non_web_accessible_url =
       extension->GetResourceURL("inaccessible-iframe-contents.html");
 
-  GURL main_url = embedded_test_server()->GetURL(
-      "/frame_tree/page_with_two_frames_remote_and_local.html");
-  ui_test_utils::NavigateToURL(browser(), main_url);
-
-  // Attempt to navigate the remote frame to a non-web-accessible-resource.
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  content::TestNavigationObserver nav_observer(web_contents, 1);
-  ASSERT_TRUE(content::ExecJs(
-      web_contents, content::JsReplace("window.open($1, 'remote-frame')",
-                                       non_web_accessible_url)));
-
-  // TODO(lukasza): https://crbug.com/1003957: Enable this test after removing
-  // ChromeContentBrowserClientExtensionsPart::ShouldAllowOpenURL.
-#if 0
-  nav_observer.Wait();
-
-  // Verify that the navigation has failed.
-  EXPECT_FALSE(nav_observer.last_navigation_succeeded());
-  EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, nav_observer.last_net_error_code());
-#endif
+  OpenUrlInSubFrameAndVerifyNavigationBlocked(
+      non_web_accessible_url, "remote-frame", non_web_accessible_url);
 }
 
 // This is a regression test for https://crbug.com/442579.
@@ -475,6 +530,12 @@
   nav_observer.Wait();
 
   // Verify that the navigation has failed.
+  //
+  // It is important that the failure mode below is the same in _all_ of the
+  // tests like (to prevent fingerprinting):
+  // - WebNavigationToNonWebAccessibleResource...
+  // - WebNavigationToNonExistentResource
+  // - WebNavigationToNonExistentExtension
   EXPECT_FALSE(nav_observer.last_navigation_succeeded());
   EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, nav_observer.last_net_error_code());
 }
diff --git a/chrome/browser/extensions/process_manager_browsertest.cc b/chrome/browser/extensions/process_manager_browsertest.cc
index 3d5deb56..3409c28 100644
--- a/chrome/browser/extensions/process_manager_browsertest.cc
+++ b/chrome/browser/extensions/process_manager_browsertest.cc
@@ -1448,16 +1448,18 @@
   EXPECT_FALSE(WebAccessibleResourcesInfo::IsResourceWebAccessible(
       extension2, extension2_manifest.path()));
   {
+    content::TestNavigationObserver nav_observer(tab, 1);
     EXPECT_TRUE(ExecuteScript(
         tab, base::StringPrintf("frames[0].location.href = '%s';",
                                 extension2_manifest.spec().c_str())));
-    WaitForLoadStop(tab);
-    EXPECT_EQ(extension2_empty,
-              ChildFrameAt(main_frame, 0)->GetLastCommittedURL())
-        << "The URL of frames[0] should not have changed";
-    EXPECT_EQ(3u, pm->GetAllFrames().size());
+    nav_observer.Wait();
+    EXPECT_FALSE(nav_observer.last_navigation_succeeded());
+    EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, nav_observer.last_net_error_code());
+    EXPECT_EQ(extension2_manifest,
+              ChildFrameAt(main_frame, 0)->GetLastCommittedURL());
+    EXPECT_EQ(2u, pm->GetAllFrames().size());
     EXPECT_EQ(2u, pm->GetRenderFrameHostsForExtension(extension1->id()).size());
-    EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension2->id()).size());
+    EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension2->id()).size());
   }
 
   // extension1 should not be able to navigate its second iframe to
@@ -1476,9 +1478,9 @@
               ChildFrameAt(main_frame, 1)->GetLastCommittedURL())
         << "The initial navigation should be allowed, but not the server "
            "redirect to extension2's manifest";
-    EXPECT_EQ(2u, pm->GetAllFrames().size());
+    EXPECT_EQ(1u, pm->GetAllFrames().size());
     EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension1->id()).size());
-    EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension2->id()).size());
+    EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension2->id()).size());
   }
 
   // extension1 can embed a webaccessible resource of extension2 by means of
@@ -1497,9 +1499,9 @@
     EXPECT_EQ(extension2_empty,
               ChildFrameAt(main_frame, 1)->GetLastCommittedURL())
         << "The URL of frames[1] should have changed";
-    EXPECT_EQ(3u, pm->GetAllFrames().size());
+    EXPECT_EQ(2u, pm->GetAllFrames().size());
     EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension1->id()).size());
-    EXPECT_EQ(2u, pm->GetRenderFrameHostsForExtension(extension2->id()).size());
+    EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension2->id()).size());
   }
 }
 
diff --git a/chrome/browser/extensions/window_open_apitest.cc b/chrome/browser/extensions/window_open_apitest.cc
index 340fea0..c815445 100644
--- a/chrome/browser/extensions/window_open_apitest.cc
+++ b/chrome/browser/extensions/window_open_apitest.cc
@@ -274,15 +274,18 @@
   GURL start_url = extension->GetResourceURL("/test.html");
   ui_test_utils::NavigateToURL(browser(), start_url);
   WebContents* newtab = nullptr;
-  bool new_page_in_same_process = true;
+  bool new_page_in_same_process = false;
   bool expect_success = false;
+  GURL broken_extension_url(
+      "chrome-extension://thisissurelynotavalidextensionid/newtab.html");
   ASSERT_NO_FATAL_FAILURE(OpenWindow(
       browser()->tab_strip_model()->GetActiveWebContents(),
-      GURL("chrome-extension://thisissurelynotavalidextensionid/newtab.html"),
-      new_page_in_same_process, expect_success, &newtab));
+      broken_extension_url, new_page_in_same_process, expect_success, &newtab));
 
-  // This is expected to redirect to about:blank.
-  EXPECT_EQ(GURL(url::kAboutBlankURL), newtab->GetLastCommittedURL());
+  EXPECT_EQ(broken_extension_url,
+            newtab->GetMainFrame()->GetLastCommittedURL());
+  EXPECT_EQ(content::PAGE_TYPE_ERROR,
+            newtab->GetController().GetLastCommittedEntry()->GetPageType());
 }
 
 // Tests that calling window.open from the newtab page to an extension URL
@@ -334,7 +337,9 @@
   content::WebContents* newtab = controller->GetWebContents();
   ASSERT_TRUE(newtab);
 
-  EXPECT_NE(extension_url, newtab->GetMainFrame()->GetLastCommittedURL());
+  EXPECT_EQ(content::PAGE_TYPE_ERROR,
+            newtab->GetController().GetLastCommittedEntry()->GetPageType());
+  EXPECT_EQ(extension_url, newtab->GetMainFrame()->GetLastCommittedURL());
   EXPECT_FALSE(newtab->GetMainFrame()->GetSiteInstance()->GetSiteURL().SchemeIs(
       extensions::kExtensionScheme));
 }
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index e469854..2cb78c6 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -2858,6 +2858,11 @@
     "expiry_milestone": 78
   },
   {
+    "name": "percent-based-scrolling",
+    "owners": [ "maamert@microsoft.com" ],
+    "expiry_milestone": 82
+  },
+  {
     "name": "periodic-background-sync",
     "owners": [ "nator" ],
     "expiry_milestone": 80
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 9d5d6113..37c690a 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -1600,6 +1600,11 @@
 const char kForceWebContentsDarkModeDescription[] =
     "Automatically render all web contents using a dark theme.";
 
+const char kPercentBasedScrollingName[] = "Percent-based Scrolling";
+const char kPercentBasedScrollingDescription[] =
+    "If enabled, mousewheel and keyboard scrolls will scroll by a percentage "
+    "of the scroller size.";
+
 const char kPeriodicBackgroundSyncName[] = "Periodic Background Sync";
 const char kPeriodicBackgroundSyncDescription[] =
     "If enabled, web apps can periodically sync content in the background.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index f102cf70..9cb8433 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -961,6 +961,9 @@
 extern const char kForceWebContentsDarkModeName[];
 extern const char kForceWebContentsDarkModeDescription[];
 
+extern const char kPercentBasedScrollingName[];
+extern const char kPercentBasedScrollingDescription[];
+
 extern const char kPeriodicBackgroundSyncName[];
 extern const char kPeriodicBackgroundSyncDescription[];
 
diff --git a/chrome/browser/lifetime/application_lifetime_unittest.cc b/chrome/browser/lifetime/application_lifetime_unittest.cc
index 85b2cce..45fc1d0c 100644
--- a/chrome/browser/lifetime/application_lifetime_unittest.cc
+++ b/chrome/browser/lifetime/application_lifetime_unittest.cc
@@ -6,6 +6,8 @@
 
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/lifetime/browser_shutdown.h"
+#include "chrome/browser/ui/browser_list.h"
+#include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "chrome/test/base/in_process_browser_test.h"
@@ -27,3 +29,87 @@
   // ran after this one will fail.
   browser_shutdown::SetTryingToQuit(false);
 }
+
+TEST_F(ApplicationLifetimeTest, AttemptRestartWithIncognitoAfterRegular) {
+  ASSERT_TRUE(g_browser_process);
+  base::CommandLine& old_cl(*base::CommandLine::ForCurrentProcess());
+  TestingPrefServiceSimple* testing_pref_service =
+      profile_manager()->local_state()->Get();
+  EXPECT_FALSE(testing_pref_service->GetBoolean(prefs::kWasRestarted));
+
+  // Create a new incognito browser.
+  TestingProfile::Builder profile_builder;
+  std::unique_ptr<TestingProfile> test_profile = profile_builder.Build();
+  Browser::CreateParams params{test_profile->GetOffTheRecordProfile(), false};
+  std::unique_ptr<BrowserWindow> test_window(CreateBrowserWindow());
+  params.window = test_window.get();
+  std::unique_ptr<Browser> incognito_browser(Browser::Create(params));
+
+  EXPECT_TRUE(incognito_browser);
+  EXPECT_TRUE(incognito_browser->profile()->IsIncognitoProfile());
+  BrowserList::SetLastActive(incognito_browser.get());
+
+  // When the first browser was created it was created in regular
+  // mode, so the command line arguments for it shouldn't have the incongito
+  // switch.
+  EXPECT_FALSE(old_cl.HasSwitch(switches::kIncognito));
+  // We will now attempt restart, prior to (crbug.com/999085)
+  // the new session after restart defaulted to the browser type
+  // of the last session. We now restart to the browser type of
+  // the user who invoked restart, which is emulated here,
+  // via the method BrowserList::SetLastActive().
+  chrome::AttemptRestart();
+  // Since, the last active browser was of type Incognito, we now
+  // expect to have the kIncognito switch added to the old_cl cmd line
+  // arguments, the old_cl arguments are then used to create the
+  // new cmd line session post restart.
+  EXPECT_TRUE(old_cl.HasSwitch(switches::kIncognito));
+  EXPECT_TRUE(testing_pref_service->GetBoolean(prefs::kWasRestarted));
+
+  // Cancel the effects of us calling chrome::AttemptRestart. Otherwise tests
+  // ran after this one will fail.
+  browser_shutdown::SetTryingToQuit(false);
+
+  // We perform the run loop before to avoid ASAN failures which access
+  // the Testing profile after the test is run.
+  base::RunLoop().RunUntilIdle();
+}
+
+TEST_F(ApplicationLifetimeTest, AttemptRestartWithRegularAfterIncognito) {
+  ASSERT_TRUE(g_browser_process);
+  base::CommandLine& old_cl(*base::CommandLine::ForCurrentProcess());
+  TestingPrefServiceSimple* testing_pref_service =
+      profile_manager()->local_state()->Get();
+  EXPECT_FALSE(testing_pref_service->GetBoolean(prefs::kWasRestarted));
+
+  // Create a new incognito browser.
+  TestingProfile::Builder profile_builder;
+  std::unique_ptr<TestingProfile> test_profile = profile_builder.Build();
+  Browser::CreateParams params{test_profile->GetOffTheRecordProfile(), false};
+  std::unique_ptr<BrowserWindow> test_window(CreateBrowserWindow());
+  params.window = test_window.get();
+  std::unique_ptr<Browser> incognito_browser(Browser::Create(params));
+  EXPECT_TRUE(incognito_browser);
+  EXPECT_TRUE(incognito_browser->profile()->IsIncognitoProfile());
+
+  // Since the original browser that is created in the Setup() phase
+  // is always a regular browser, we emulate the incognito part
+  // by apppending |kIncongito| switch to its command line args.
+  old_cl.AppendSwitch(switches::kIncognito);
+
+  // Make the regular browser last active.
+  BrowserList::SetLastActive(browser());
+
+  EXPECT_TRUE(old_cl.HasSwitch(switches::kIncognito));
+  chrome::AttemptRestart();
+  EXPECT_FALSE(old_cl.HasSwitch(switches::kIncognito));
+  EXPECT_TRUE(testing_pref_service->GetBoolean(prefs::kWasRestarted));
+
+  // Cancel the effects of us calling chrome::AttemptRestart. Otherwise tests
+  // ran after this one will fail.
+  browser_shutdown::SetTryingToQuit(false);
+
+  // We perform the run loop before to avoid ASAN failures which access
+  // the Testing profile after the test is run.
+  base::RunLoop().RunUntilIdle();
+}
diff --git a/chrome/browser/portal/portal_browsertest.cc b/chrome/browser/portal/portal_browsertest.cc
new file mode 100644
index 0000000..e95283c
--- /dev/null
+++ b/chrome/browser/portal/portal_browsertest.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 <vector>
+
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test_utils.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "third_party/blink/public/common/features.h"
+
+using content::WebContents;
+
+class PortalBrowserTest : public InProcessBrowserTest {
+ public:
+  PortalBrowserTest() = default;
+
+  void SetUp() override {
+    scoped_feature_list_.InitAndEnableFeature(blink::features::kPortals);
+    InProcessBrowserTest::SetUp();
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+// TODO(crbug.com/1006633): Test fails on Chrome OS.
+#if defined(OS_CHROMEOS)
+#define MAYBE_PortalActivation DISABLED_PortalActivation
+#else
+#define MAYBE_PortalActivation PortalActivation
+#endif
+IN_PROC_BROWSER_TEST_F(PortalBrowserTest, MAYBE_PortalActivation) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  GURL url(embedded_test_server()->GetURL("/portal/activate.html"));
+  ui_test_utils::NavigateToURL(browser(), url);
+  TabStripModel* tab_strip_model = browser()->tab_strip_model();
+  WebContents* contents = tab_strip_model->GetActiveWebContents();
+  EXPECT_EQ(1, tab_strip_model->count());
+
+  EXPECT_TRUE(content::ExecJs(contents, "loadPromise"));
+  std::vector<WebContents*> inner_web_contents =
+      contents->GetInnerWebContents();
+  EXPECT_EQ(1u, inner_web_contents.size());
+  WebContents* portal_contents = inner_web_contents[0];
+
+  EXPECT_TRUE(content::ExecJs(contents, "activate()"));
+  EXPECT_EQ(1, tab_strip_model->count());
+  EXPECT_EQ(portal_contents, tab_strip_model->GetActiveWebContents());
+}
diff --git a/chrome/browser/printing/print_preview_message_handler.cc b/chrome/browser/printing/print_preview_message_handler.cc
index e18eeb6..65655682 100644
--- a/chrome/browser/printing/print_preview_message_handler.cc
+++ b/chrome/browser/printing/print_preview_message_handler.cc
@@ -31,6 +31,7 @@
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui.h"
+#include "mojo/public/cpp/bindings/callback_helpers.h"
 #include "printing/nup_parameters.h"
 #include "printing/page_setup.h"
 #include "printing/print_job_constants.h"
@@ -353,8 +354,12 @@
       client->DoNupPdfConvert(
           document_cookie, pages_per_sheet, print_preview_ui->page_size(),
           printable_area, std::move(pdf_page_regions),
-          base::BindOnce(&PrintPreviewMessageHandler::OnNupPdfConvertDone,
-                         weak_ptr_factory_.GetWeakPtr(), new_page_number, ids));
+          mojo::WrapCallbackWithDefaultInvokeIfNotRun(
+              base::BindOnce(&PrintPreviewMessageHandler::OnNupPdfConvertDone,
+                             weak_ptr_factory_.GetWeakPtr(), new_page_number,
+                             ids),
+              mojom::PdfNupConverter::Status::CONVERSION_FAILURE,
+              base::ReadOnlySharedMemoryRegion()));
     }
   }
 }
@@ -365,12 +370,14 @@
     mojom::PdfNupConverter::Status status,
     base::ReadOnlySharedMemoryRegion region) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  PrintPreviewUI* print_preview_ui = GetPrintPreviewUI(ids.ui_id);
   if (status != mojom::PdfNupConverter::Status::SUCCESS) {
     DLOG(ERROR) << "Nup pdf page conversion failed with error " << status;
+    if (print_preview_ui)
+      print_preview_ui->OnPrintPreviewFailed(ids.request_id);
     return;
   }
 
-  PrintPreviewUI* print_preview_ui = GetPrintPreviewUI(ids.ui_id);
   if (!print_preview_ui)
     return;
 
@@ -412,10 +419,13 @@
     client->DoNupPdfDocumentConvert(
         document_cookie, pages_per_sheet, print_preview_ui->page_size(),
         printable_area, std::move(region),
-        base::BindOnce(&PrintPreviewMessageHandler::OnNupPdfDocumentConvertDone,
-                       weak_ptr_factory_.GetWeakPtr(),
-                       (page_count + pages_per_sheet - 1) / pages_per_sheet,
-                       ids));
+        mojo::WrapCallbackWithDefaultInvokeIfNotRun(
+            base::BindOnce(
+                &PrintPreviewMessageHandler::OnNupPdfDocumentConvertDone,
+                weak_ptr_factory_.GetWeakPtr(),
+                (page_count + pages_per_sheet - 1) / pages_per_sheet, ids),
+            mojom::PdfNupConverter::Status::CONVERSION_FAILURE,
+            base::ReadOnlySharedMemoryRegion()));
   }
 }
 
@@ -425,12 +435,14 @@
     mojom::PdfNupConverter::Status status,
     base::ReadOnlySharedMemoryRegion region) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  PrintPreviewUI* print_preview_ui = GetPrintPreviewUI(ids.ui_id);
   if (status != mojom::PdfNupConverter::Status::SUCCESS) {
     DLOG(ERROR) << "Nup pdf document convert failed with error " << status;
+    if (print_preview_ui)
+      print_preview_ui->OnPrintPreviewFailed(ids.request_id);
     return;
   }
 
-  PrintPreviewUI* print_preview_ui = GetPrintPreviewUI(ids.ui_id);
   if (!print_preview_ui)
     return;
 
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 7b930ce..5cce2fd 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
@@ -374,6 +374,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{የኋሊት ጥቅስ}one{# የኋሊት ጥቅሶች}other{# የኋሊት ጥቅሶች}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{ዶላር}one{# የዶላር ምልክቶች}other{# የዶላር ምልክቶች}}</translation>
+<translation id="3658742229777143148">ክለሳ</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />፣ የዝርዝር ሳጥን</translation>
 <translation id="3681531118904532409">ፓፓያ ዊፕ</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 26692255..09b39fb 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{علامة تجزئة واحدة}zero{# backticks}two{علامتا تجزئة (#)}few{# علامات تجزئة}many{# علامة تجزئة}other{# من علامات التجزئة}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{علامة دولار واحدة}zero{# dollar signs}two{علامتا دولار (#)}few{# علامات دولار}many{# علامة دولار}other{# من علامات الدولار}}</translation>
+<translation id="3658742229777143148">التعديل</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755">مربع القائمة <ph name="VALUE" /></translation>
 <translation id="3681531118904532409">أصفر باهت</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 e0cfc03..fa5a698 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
@@ -374,6 +374,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{обратен апостроф}other{# обратни апострофа}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{знак за долар}other{# знака за долар}}</translation>
+<translation id="3658742229777143148">Ревизия</translation>
 <translation id="3659787053479271466">сигнал</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, списъчно поле</translation>
 <translation id="3681531118904532409">папая</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 dfaa2f2..bf68c94 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{ব্যাকটিক}one{#টি ব্যাকটিক}other{#টি ব্যাকটিক}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{ডলার}one{#টি ডলার চিহ্ন}other{#টি ডলার চিহ্ন}}</translation>
+<translation id="3658742229777143148">পুনর্বিবেচনা</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, তালিকা বাক্স</translation>
 <translation id="3681531118904532409">পাপায়া হুইপ</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 b72f1ba..614bf27 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
@@ -374,6 +374,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{accent agut}other{# accents aguts}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dòlar}other{# símbols de dòlar}}</translation>
+<translation id="3658742229777143148">Revisió</translation>
 <translation id="3659787053479271466">alerta</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, quadre de llista</translation>
 <translation id="3681531118904532409">Papaia clar</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 c35dee6..d1cd4b9f 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_cs.xtb
@@ -374,6 +374,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{zpětná uvozovka}few{# zpětné uvozovky}many{# backticks}other{# zpětných uvozovek}}</translation>
 <translation id="3650317109285159359">zaškrt pol nabíd</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dolar}few{# znaky dolar}many{# dollar signs}other{# znaků dolar}}</translation>
+<translation id="3658742229777143148">Verze</translation>
 <translation id="3659787053479271466">upoz</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, seznam</translation>
 <translation id="3681531118904532409">Papájová</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 3487de6..4742a9a 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{accent grave}one{# accent graver}other{# accent graver}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dollar}one{# dollartegn}other{# dollartegn}}</translation>
+<translation id="3658742229777143148">Revision</translation>
 <translation id="3659787053479271466">advar</translation>
 <translation id="3665563998540286755">Listefeltet <ph name="VALUE" /></translation>
 <translation id="3681531118904532409">Lys varm orange</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 ed9a6719..f29aa25 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
@@ -374,6 +374,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{Backtick}other{# Backticks}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{Dollarzeichen}other{# Dollarzeichen}}</translation>
+<translation id="3658742229777143148">Überarbeitung</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, Listenfeld</translation>
 <translation id="3681531118904532409">Helles Orangegelb</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 1af5253..b3e03fe6d 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{βαρεία}other{# βαρείες}}</translation>
 <translation id="3650317109285159359">πλαίσιο επιλογής στοιχείου μενού</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{σύμβολο δολαρίου}other{# σύμβολα δολαρίου}}</translation>
+<translation id="3658742229777143148">Αναθεώρηση</translation>
 <translation id="3659787053479271466">ειδοποίηση</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, πλαίσιο λίστας</translation>
 <translation id="3681531118904532409">Ανοιχτό παπάγιας</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 3e3783a..8828b1fb6 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
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{backtick}other{# backticks}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dollar}other{# dollar signs}}</translation>
+<translation id="3658742229777143148">Revision</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, list box</translation>
 <translation id="3681531118904532409">Papaya Whip</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 ea6e326..e68e7446 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
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{comilla simple}other{# comillas simples}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dólar}other{# signos de dólar}}</translation>
+<translation id="3658742229777143148">Revisión</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, cuadro de lista</translation>
 <translation id="3681531118904532409">Fusta de papaya</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 25b38dc..d1e1fc5 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{comilla simple}other{# comillas simples}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dólar}other{# símbolos de dólar}}</translation>
+<translation id="3658742229777143148">Revisión</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, cuadro de lista</translation>
 <translation id="3681531118904532409">Papaya</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 cf68bed..2345ffc 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{graavis}other{# graavist}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dollar}other{# dollarimärki}}</translation>
+<translation id="3658742229777143148">Redaktsioon</translation>
 <translation id="3659787053479271466">alarm</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, loendiboks</translation>
 <translation id="3681531118904532409">Papaiaoranž</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 c130890..f568bce6 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{نقل قول وارونه}one{# نقل قول وارونه}other{# نقل قول وارونه}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{علامت دلار}one{# علامت دلار}other{# علامت دلار}}</translation>
+<translation id="3658742229777143148">ویرایش</translation>
 <translation id="3659787053479271466">هشدار</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />، کادر فهرست</translation>
 <translation id="3681531118904532409">هلویی روشن</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 939700e..166f072 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{aksenttimerkki}other{# aksenttimerkkiä}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dollari}other{# dollarimerkkiä}}</translation>
+<translation id="3658742229777143148">Päivitetty versio</translation>
 <translation id="3659787053479271466">ilm.</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, luetteloruutu</translation>
 <translation id="3681531118904532409">Papaija</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 223289f5b..3828ceb 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{backtick}one{# backtick}other{# na backtick}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dollar}one{# dollar sign}other{# na dollar sign}}</translation>
+<translation id="3658742229777143148">Rebisyon</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, kahon ng listahan</translation>
 <translation id="3681531118904532409">Papaya Whip</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 2d34b5f3..fb1b1836 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{apostrophe inversée}one{# apostrophe inversée}other{# apostrophes inversées}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dollar}one{# dollar}other{# dollars}}</translation>
+<translation id="3658742229777143148">Révision</translation>
 <translation id="3659787053479271466">alerte</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, zone de liste.</translation>
 <translation id="3681531118904532409">Chair clair</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 5bd7a579..0da7c16 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{બેકટિક}one{# બેકટિક}other{# બેકટિક}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{ડૉલર}one{# ડૉલરની નિશાની}other{# ડૉલરની નિશાની}}</translation>
+<translation id="3658742229777143148">પુનરાવર્તન</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, સૂચિ બૉક્સ</translation>
 <translation id="3681531118904532409">પપાયા વ્હિપ</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 c844abd..f2a08ac3 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{बैकटिक}one{# बैकटिक}other{# बैकटिक}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{डॉलर}one{# डॉलर चिह्न}other{# डॉलर चिह्न}}</translation>
+<translation id="3658742229777143148">पुनरीक्षण</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, सूची बॉक्‍स</translation>
 <translation id="3681531118904532409">पपाया विप जैसा रंग</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 dae67999..1d40c809 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{zatvoreni jednostruki navodnik}one{# zatvoreni jednostruki navodnik}few{# zatvorena jednostruka navodnika}other{# zatvorenih jednostrukih navodnika}}</translation>
 <translation id="3650317109285159359">ptvrdstizb</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{znak dolara}one{# znak dolara}few{# znaka dolara}other{# znakova dolara}}</translation>
+<translation id="3658742229777143148">Izmjena</translation>
 <translation id="3659787053479271466">upoz</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, okvir s popisom</translation>
 <translation id="3681531118904532409">Papaja</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 98f04e6..76b487ce 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{egyszeres nyitó idézőjel}other{# egyszeres nyitó idézőjel}}</translation>
 <translation id="3650317109285159359">jelölőnégyzet menüelem</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dollárjel}other{# dollárjel}}</translation>
+<translation id="3658742229777143148">Ellenőrzés</translation>
 <translation id="3659787053479271466">riaszt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, lista</translation>
 <translation id="3681531118904532409">Papajahab</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 a583eb3a..ecb17bee 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{petik satu}other{# petik satu}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dolar}other{# tanda dolar}}</translation>
+<translation id="3658742229777143148">Revisi</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, kotak daftar</translation>
 <translation id="3681531118904532409">Papaya Whip</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 eb9f29c..d51ba2d9 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb
@@ -374,6 +374,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{apice inverso}other{# apici inversi}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dollaro}other{# simboli dollaro}}</translation>
+<translation id="3658742229777143148">Revisione</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, casella di riepilogo</translation>
 <translation id="3681531118904532409">Panna papaya</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 50cae76..c3fca9b7 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{סימן הטעמה משני (`)}two{# סימני הטעמה משניים (`)}many{# סימני הטעמה משניים (`)}other{# סימני הטעמה משניים (`)}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{דולר}two{# סימני דולר}many{# סימני דולר}other{# סימני דולר}}</translation>
+<translation id="3658742229777143148">גרסה קודמת</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, תיבת רשימה</translation>
 <translation id="3681531118904532409">וניל פפאיה</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 3fd9ee7..5500c82 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{バッククォート}other{# 個のバッククォート}}</translation>
 <translation id="3650317109285159359">メニュー項目のチェックボックス</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{ドル}other{# 個のドル記号}}</translation>
+<translation id="3658742229777143148">変更履歴</translation>
 <translation id="3659787053479271466">アラート</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />、リスト ボックス</translation>
 <translation id="3681531118904532409">パパイヤ ウィップ</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 afa443a..a8e262db 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{ಬ್ಯಾಕ್‌ಟಿಕ್}one{# ಬ್ಯಾಕ್‌ಟಿಕ್‌ಗಳು}other{# ಬ್ಯಾಕ್‌ಟಿಕ್‌ಗಳು}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{ಡಾಲರ್}one{# ಡಾಲರ್ ಚಿಹ್ನೆಗಳು}other{# ಡಾಲರ್ ಚಿಹ್ನೆಗಳು}}</translation>
+<translation id="3658742229777143148">ಪರಿಷ್ಕರಣೆ</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, ಪಟ್ಟಿಯ ಬಾಕ್ಸ್</translation>
 <translation id="3681531118904532409">ಪಪಾಯ ವಿಪ್</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 23afdb1..310200d9 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{백틱 기호}other{백틱 기호 #개}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{달러 기호}other{달러 기호 #개}}</translation>
+<translation id="3658742229777143148">개정</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, 목록 상자</translation>
 <translation id="3681531118904532409">파파야 윕</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 63155f45..b7fa2bf 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lt.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{gravis}one{# gravis}few{# graviai}many{# backticks}other{# gravių}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dolerio ženklas}one{# dolerio ženklas}few{# dolerio ženklai}many{# dollar signs}other{# dolerio ženklų}}</translation>
+<translation id="3658742229777143148">Peržiūrėtas ir pataisytas leidimas</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, sąrašo laukelis</translation>
 <translation id="3681531118904532409">Švelni persikų spalva</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 dca1ec3..2a1ba84b 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{gravis}zero{# gravju}one{# gravis}other{# gravji}}</translation>
 <translation id="3650317109285159359">izvēlnes vienumu izvēles rūtiņa</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dolāra zīme}zero{# dolāra zīmju}one{# dolāra zīme}other{# dolāra zīmes}}</translation>
+<translation id="3658742229777143148">Pārskatīšana</translation>
 <translation id="3659787053479271466">brīdinājums</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, sarakstlodziņš</translation>
 <translation id="3681531118904532409">Gaiša papaju</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 d44f9d9..98d16666 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
@@ -374,6 +374,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{ബാക്ക്‌ടിക്ക്}other{# ബാക്ക്‌ടിക്കുകൾ}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{ഡോളർ}other{# ഡോളർ ചിഹ്നങ്ങൾ}}</translation>
+<translation id="3658742229777143148">പുനരവലോകനം</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, ലിസ്റ്റ് ബോക്സ്</translation>
 <translation id="3681531118904532409">പപ്പായ വിപ്പ്</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 11e1bc9..03b14c1 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_mr.xtb
@@ -371,6 +371,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{बॅकटिक}other{# बॅकटिक}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{डॉलर}other{# डॉलर चिन्हे}}</translation>
+<translation id="3658742229777143148">पुनरावृत्ती</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, सूची बॉक्स</translation>
 <translation id="3681531118904532409">हलका गुलाबी</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 25feb34..f1cc3bc 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{tanda belakang}other{# tanda belakang}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dolar}other{# tanda dolar}}</translation>
+<translation id="3658742229777143148">Semakan</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755">Kotak senarai, <ph name="VALUE" /></translation>
 <translation id="3681531118904532409">Air Betik</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 629dffa3..bd6da24 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
@@ -374,6 +374,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{accent grave}other{# accents grave}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dollarteken}other{# dollartekens}}</translation>
+<translation id="3658742229777143148">Revisie</translation>
 <translation id="3659787053479271466">waarschuwing</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, keuzelijst</translation>
 <translation id="3681531118904532409">Papayacréme</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 6fde59a..70ce8c3 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{venstreaksent}other{# venstreaksenter}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dollar}other{# dollartegn}}</translation>
+<translation id="3658742229777143148">Versjon</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, listefelt</translation>
 <translation id="3681531118904532409">Papayakrem</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 e3a00a2..96b136e 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{grawis}few{# grawisy}many{# grawisów}other{# backticks}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dolar}few{# znaki dolara}many{# znaków dolara}other{# dollar signs}}</translation>
+<translation id="3658742229777143148">Wersja</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, pole listy</translation>
 <translation id="3681531118904532409">Papaja</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 72cdc63..fc07040 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
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{acento grave}one{# acentos graves}other{# acentos graves}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{cifrão}one{# indicadores de cifrão}other{# indicadores de cifrão}}</translation>
+<translation id="3658742229777143148">Revisão</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755">Caixa de listagem <ph name="VALUE" /></translation>
 <translation id="3681531118904532409">Papaia</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 e463473..3b27722 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
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{acento grave}other{# acentos graves}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dólar}other{# sinais de dólar}}</translation>
+<translation id="3658742229777143148">Revisão</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, caixa de lista</translation>
 <translation id="3681531118904532409">Papaia</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 2e6965f..8d6275f 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{ghilimea simplă}few{# ghilimele simple}other{# de ghilimele simple}}</translation>
 <translation id="3650317109285159359">casetă de selectare element meniu</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dolar}few{# semne dolar}other{# de semne dolar}}</translation>
+<translation id="3658742229777143148">Versiune</translation>
 <translation id="3659787053479271466">alertă</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, casetă listă</translation>
 <translation id="3681531118904532409">Roz deschis</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 1f2416b..e1d625e 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{обратная кавычка}one{# обратная кавычка}few{# обратные кавычки}many{# обратных кавычек}other{# backticks}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{знак доллара}one{# знак доллара}few{# знака доллара}many{# знаков доллара}other{# dollar signs}}</translation>
+<translation id="3658742229777143148">Версия</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755">Список, <ph name="VALUE" /></translation>
 <translation id="3681531118904532409">Папайя со взбитыми сливками</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 be96531..0567c68 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sk.xtb
@@ -374,6 +374,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{obrátený dĺžeň}few{# obrátené dĺžne}many{# backticks}other{# obrátených dĺžňov}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dolár}few{# znaky dolára}many{# dollar signs}other{# znakov dolára}}</translation>
+<translation id="3658742229777143148">Verzia</translation>
 <translation id="3659787053479271466">upozornenie</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, zoznamové pole</translation>
 <translation id="3681531118904532409">Papájová</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 dd52400..f3e83e8d6 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{znak za krativec}one{# znak za krativec}two{# znaka za krativec}few{# znaki za krativec}other{# znakov za krativec}}</translation>
 <translation id="3650317109285159359">potokelmen</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{znak za dolar}one{# znak za dolar}two{# znaka za dolar}few{# znaki za dolar}other{# znakov za dolar}}</translation>
+<translation id="3658742229777143148">Različica</translation>
 <translation id="3659787053479271466">opoz</translation>
 <translation id="3665563998540286755">Polje s seznamom z vrednostjo <ph name="VALUE" /></translation>
 <translation id="3681531118904532409">Marelična</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 a647cc5..f8ba1441 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{обрнути полунаводник}one{# обрнути полунаводник}few{# обрнута полунаводника}other{# обрнутих полунаводника}}</translation>
 <translation id="3650317109285159359">поље за потврду ставке менија</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{знак за долар}one{# знак за долар}few{# знака за долар}other{# знакова за долар}}</translation>
+<translation id="3658742229777143148">Ревизија</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, оквир листе</translation>
 <translation id="3681531118904532409">Бледа розенаранџаста</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 4e068b27..fa70346d 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{grav accent}other{# grav accent-tecken}}</translation>
 <translation id="3650317109285159359">menyalternativ med kryssruta</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dollartecken}other{# dollartecken}}</translation>
+<translation id="3658742229777143148">Version</translation>
 <translation id="3659787053479271466">varning</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, listruta</translation>
 <translation id="3681531118904532409">Papayakrämorange</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 e265eb2..66749eb2 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
@@ -374,6 +374,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{kingo`ngo}other{ving`ong`o #}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dola}other{alama # za dola}}</translation>
+<translation id="3658742229777143148">Marekebisho</translation>
 <translation id="3659787053479271466">arifa</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, kisanduku cha orodha</translation>
 <translation id="3681531118904532409">Nyekundu Iliyofifia</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 9fadabb..0ef3b6b 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{பேக்டிக்}other{# பேக்டிக்குகள்}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{டாலர் குறி}other{# டாலர் குறிகள்}}</translation>
+<translation id="3658742229777143148">மீள்திருத்தங்கள்</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, பட்டியல் பெட்டி</translation>
 <translation id="3681531118904532409">பப்பாயா விப்</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 4dbbab2..784edd3d 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
@@ -372,6 +372,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{బ్యాక్‌టిక్ గుర్తు}other{# బ్యాక్‌టిక్ గుర్తులు}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{డాలర్ గుర్తు}other{# డాలర్ గుర్తులు}}</translation>
+<translation id="3658742229777143148">పునర్విమర్శ</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, జాబితా పెట్టె</translation>
 <translation id="3681531118904532409">బొప్పాయి పసుపు రంగు</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 63fcb85..ed4b6f0 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
@@ -374,6 +374,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{เครื่องหมายแบ็กทิก}other{# เครื่องหมายแบ็กทิก}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{เครื่องหมายดอลลาร์}other{# เครื่องหมายดอลลาร์}}</translation>
+<translation id="3658742229777143148">การแก้ไข</translation>
 <translation id="3659787053479271466">การแจ้งเตือน</translation>
 <translation id="3665563998540286755">ช่องรายการ <ph name="VALUE" /></translation>
 <translation id="3681531118904532409">สีชมพูพาพายาวิป</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 b8dfacbd..528274c 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
@@ -374,6 +374,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{aksan işareti}other{# aksan işareti}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dolar işareti}other{# dolar işareti}}</translation>
+<translation id="3658742229777143148">Düzeltme</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, liste kutusu</translation>
 <translation id="3681531118904532409">Papaya Rengi</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 85ff6c71..10f76155 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
@@ -374,6 +374,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{зворотний апостроф}one{# зворотний апостроф}few{# зворотні апострофи}many{# зворотних апострофів}other{# backticks}}</translation>
 <translation id="3650317109285159359">прапорець пункту меню</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{долар}one{# символ долара}few{# символи долара}many{# символів долара}other{# dollar signs}}</translation>
+<translation id="3658742229777143148">Редакція</translation>
 <translation id="3659787053479271466">сповіщення</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, вікно списку</translation>
 <translation id="3681531118904532409">Паросток папаї</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 2fd9fc4e..be1914c1 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{dấu huyền}other{# dấu huyền}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{dấu đô la}other{# dấu đô la}}</translation>
+<translation id="3658742229777143148">Bản sửa đổi</translation>
 <translation id="3659787053479271466">alrt</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />, hộp danh sách</translation>
 <translation id="3681531118904532409">Màu đu đủ</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 03b9a69..dc12fd2 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
@@ -374,6 +374,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{1个反撇号}other{#个反撇号}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{1个美元符号}other{#个美元符号}}</translation>
+<translation id="3658742229777143148">修订版本</translation>
 <translation id="3659787053479271466">提醒</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />,列表框</translation>
 <translation id="3681531118904532409">蕃木瓜色</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 aa0d5586..bbf4ea8 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
@@ -375,6 +375,7 @@
 <translation id="3646890046000188562">{COUNT,plural, =1{反引號}other{# 個反引號}}</translation>
 <translation id="3650317109285159359">chkmnuitm</translation>
 <translation id="3655855170848725876">{COUNT,plural, =1{美元}other{# 個美元符號}}</translation>
+<translation id="3658742229777143148">修訂版本</translation>
 <translation id="3659787053479271466">警示</translation>
 <translation id="3665563998540286755"><ph name="VALUE" />,清單方塊</translation>
 <translation id="3681531118904532409">番木瓜色</translation>
diff --git a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.html b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.html
index 22713c7..9dd1585 100644
--- a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.html
+++ b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.html
@@ -51,7 +51,6 @@
         <div slot="title">[[getDialogTitle_(type)]]</div>
         <div slot="body">
           <network-config id="networkConfig" class="flex"
-              networking-private="[[networkingPrivate]]"
               guid="[[guid_]]" type="{{type_}}"
               enable-connect="{{enableConnect_}}"
               share-allow-enable="[[shareAllowEnable_]]"
diff --git a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js
index 23a1af5..63de99d 100644
--- a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js
+++ b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js
@@ -14,15 +14,6 @@
   behaviors: [I18nBehavior],
 
   properties: {
-    /**
-     * Interface for networkingPrivate calls.
-     * @type {NetworkingPrivate}
-     */
-    networkingPrivate: {
-      type: Object,
-      value: chrome.networkingPrivate,
-    },
-
     /** @private */
     shareAllowEnable_: {
       type: Boolean,
diff --git a/chrome/browser/resources/chromeos/login/screen_error_message.js b/chrome/browser/resources/chromeos/login/screen_error_message.js
index f33c577e..96356f0 100644
--- a/chrome/browser/resources/chromeos/login/screen_error_message.js
+++ b/chrome/browser/resources/chromeos/login/screen_error_message.js
@@ -75,6 +75,7 @@
       'setErrorState',
       'showConnectingIndicator',
       'setErrorStateNetwork',
+      'setIsPersistentError',
     ],
 
     // Error screen initial UI state.
@@ -83,12 +84,18 @@
     // Error screen initial error state.
     error_state_: ERROR_STATE.UNKNOWN,
 
+    // True if it is forbidden to close the error message.
+    is_persistent_error_: false,
+
     /**
      * Whether the screen can be closed.
+     * |is_persistent_error_| prevents error screen to be closable even
+     * if there are some user pods.
+     * (E.g. out of OOBE process on the sign-in screen).
      * @type {boolean}
      */
     get closable() {
-      return Oobe.getInstance().hasUserPods;
+      return Oobe.getInstance().hasUserPods && !this.is_persistent_error_;
     },
 
     /**
@@ -255,6 +262,8 @@
      */
     onBeforeHide: function() {
       Oobe.getInstance().setSigninUIState(SIGNIN_UI_STATE.HIDDEN);
+      // Reset property to the default state.
+      this.setIsPersistentError(false);
     },
 
     /**
@@ -376,5 +385,12 @@
       if (this.closable)
         Oobe.showUserPods();
     },
+
+    /**
+     * Makes error message non-closable.
+     */
+    setIsPersistentError: function(is_persistent) {
+      this.is_persistent_error_ = is_persistent;
+    }
   };
 });
diff --git a/chrome/browser/resources/pdf/pdf_viewer.js b/chrome/browser/resources/pdf/pdf_viewer.js
index abba1a1..8c15ca9 100644
--- a/chrome/browser/resources/pdf/pdf_viewer.js
+++ b/chrome/browser/resources/pdf/pdf_viewer.js
@@ -416,7 +416,8 @@
 
     // Request translated strings.
     chrome.resourcesPrivate.getStrings(
-        'pdf', strings => this.handleStrings_(strings));
+        chrome.resourcesPrivate.Component.PDF,
+        strings => this.handleStrings_(strings));
 
     // Listen for save commands from the browser.
     if (chrome.mimeHandlerPrivate && chrome.mimeHandlerPrivate.onSave) {
diff --git a/chrome/browser/resources/settings/device_page/display.html b/chrome/browser/resources/settings/device_page/display.html
index 5b906f0..eb3ff4b 100644
--- a/chrome/browser/resources/settings/device_page/display.html
+++ b/chrome/browser/resources/settings/device_page/display.html
@@ -65,6 +65,10 @@
         margin-top: 20px;
       }
 
+      #nightLightOffSpacer {
+        padding-top: 28px;
+      }
+
       iron-collapse {
        width: 100%;
       }
@@ -241,54 +245,64 @@
         pref="{{prefs.ash.night_light.enabled}}"
         sub-label="$i18n{displayNightLightText}">
     </settings-toggle-button>
-    <div id="nightLightSettingsDiv"
-        class="settings-box continuation start layout vertical">
-      <!-- Color temperature slider -->
-      <div id="nightLightTemperatureDiv"
-          class="settings-box indented continuation"
-          disabled$="[[!prefs.ash.night_light.enabled.value]]">
-        <div class="start text-area" id="colorTemperatureLabel">
-          $i18n{displayNightLightTemperatureLabel}
-        </div>
-        <settings-slider id="colorTemperatureSlider"
-            aria-labelledby="colorTemperatureLabel" min="0" max="100"
-            scale="100" label-min="$i18n{displayNightLightTempSliderMinLabel}"
-            label-max="$i18n{displayNightLightTempSliderMaxLabel}"
-            pref="{{prefs.ash.night_light.color_temperature}}"
-            disabled$="[[!prefs.ash.night_light.enabled.value]]">
-        </settings-slider>
-      </div>
-      <!-- Schedule settings -->
-      <div class="settings-box indented">
-        <div class="start text-area">
-          <div id="nightLightScheduleLabel" class="label">
-            $i18n{displayNightLightScheduleLabel}
+
+    <template is="dom-if" if="[[prefs.ash.night_light.enabled.value]]">
+      <div id="nightLightSettingsDiv"
+          class="settings-box continuation start layout vertical">
+        <!-- Color temperature slider -->
+        <div id="nightLightTemperatureDiv"
+            class="settings-box indented continuation">
+          <div class="start text-area" id="colorTemperatureLabel">
+            $i18n{displayNightLightTemperatureLabel}
           </div>
-          <div id="nightLightScheduleSubLabel" class="secondary label"
-              hidden$="[[!nightLightScheduleSubLabel_]]">
-            [[nightLightScheduleSubLabel_]]
-          </div>
+          <settings-slider id="colorTemperatureSlider"
+              aria-labelledby="colorTemperatureLabel" min="0" max="100"
+              scale="100" label-min="$i18n{displayNightLightTempSliderMinLabel}"
+              label-max="$i18n{displayNightLightTempSliderMaxLabel}"
+              pref="{{prefs.ash.night_light.color_temperature}}">
+          </settings-slider>
         </div>
-        <settings-dropdown-menu
-            id="nightLightScheduleTypeDropDown"
-            aria-labelledby="nightLightScheduleLabel"
-            pref="{{prefs.ash.night_light.schedule_type}}"
-            menu-options="[[scheduleTypesList_]]">
-        </settings-dropdown-menu>
-      </div>
-      <!-- Custom schedule slider -->
-      <iron-collapse id="nightLightCustomScheduleCollapse"
-           opened="[[shouldOpenCustomScheduleCollapse_]]">
-        <div class="settings-box indented continuation">
-          <div class="start text-area layout vertical">
-            <div class="settings-box continuation self-stretch">
-              <night-light-slider id="nightLightSlider" prefs="{{prefs}}">
-              </night-light-slider>
+        <!-- Schedule settings -->
+        <div class="settings-box indented">
+          <div class="start text-area">
+            <div id="nightLightScheduleLabel" class="label">
+              $i18n{displayNightLightScheduleLabel}
+            </div>
+            <div id="nightLightScheduleSubLabel" class="secondary label"
+                hidden$="[[!nightLightScheduleSubLabel_]]">
+              [[nightLightScheduleSubLabel_]]
             </div>
           </div>
+          <settings-dropdown-menu
+              id="nightLightScheduleTypeDropDown"
+              aria-labelledby="nightLightScheduleLabel"
+              pref="{{prefs.ash.night_light.schedule_type}}"
+              menu-options="[[scheduleTypesList_]]">
+          </settings-dropdown-menu>
         </div>
-      </iron-collapse>
-    </div>
+        <!-- Custom schedule slider -->
+        <iron-collapse id="nightLightCustomScheduleCollapse"
+            opened="[[shouldOpenCustomScheduleCollapse_]]">
+          <div class="settings-box indented continuation">
+            <div class="start text-area layout vertical">
+              <div class="settings-box continuation self-stretch">
+                <night-light-slider id="nightLightSlider" prefs="{{prefs}}">
+                </night-light-slider>
+              </div>
+            </div>
+          </div>
+        </iron-collapse>
+      </div>
+    </template>
+    <template is="dom-if" if="[[!prefs.ash.night_light.enabled.value]]">
+      <!-- When the user scrolls to the bottom then enables Night Light ensure
+           that the "Schedule" select is at least partially visible so the user
+           knows they can scroll down for more controls. -->
+      <div id="nightLightOffSpacer"></div>
+    </template>
+
+    <!-- NOTE: If you add more controls here you can remove the
+         nightLightOffSpacer div above. -->
 
   </template>
   <script src="display.js"></script>
diff --git a/chrome/browser/resources/settings/internet_page/internet_config.html b/chrome/browser/resources/settings/internet_page/internet_config.html
index fa93673..65ef26e 100644
--- a/chrome/browser/resources/settings/internet_page/internet_config.html
+++ b/chrome/browser/resources/settings/internet_page/internet_config.html
@@ -26,7 +26,6 @@
       </div>
       <div slot="body">
         <network-config id="networkConfig" class="flex"
-            networking-private="[[networkingPrivate]]"
             guid="[[guid]]" name="{{name}}" type="{{type}}"
             enable-connect="{{enableConnect_}}" enable-save="{{enableSave_}}"
             share-allow-enable="[[shareAllowEnable_]]"
diff --git a/chrome/browser/resources/settings/internet_page/internet_config.js b/chrome/browser/resources/settings/internet_page/internet_config.js
index f64cc30..d5bd42d5 100644
--- a/chrome/browser/resources/settings/internet_page/internet_config.js
+++ b/chrome/browser/resources/settings/internet_page/internet_config.js
@@ -12,12 +12,6 @@
   behaviors: [I18nBehavior],
 
   properties: {
-    /**
-     * Interface for networkingPrivate calls, passed from internet_page.
-     * @type {NetworkingPrivate}
-     */
-    networkingPrivate: Object,
-
     /** @private */
     shareAllowEnable_: {
       type: Boolean,
diff --git a/chrome/browser/resources/settings/internet_page/internet_page.html b/chrome/browser/resources/settings/internet_page/internet_page.html
index 1e99c2e..f9b9963 100644
--- a/chrome/browser/resources/settings/internet_page/internet_page.html
+++ b/chrome/browser/resources/settings/internet_page/internet_page.html
@@ -1,6 +1,7 @@
 <link rel="import" href="chrome://resources/html/polymer.html">
 
 <link rel="import" href="chrome://resources/cr_components/chromeos/network/mojo_interface_provider.html">
+<link rel="import" href="chrome://resources/cr_elements/chromeos/network/cr_network_listener_behavior.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_expand_button/cr_expand_button.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html">
 <link rel="import" href="chrome://resources/cr_elements/icons.html">
@@ -125,9 +126,7 @@
     </settings-animated-pages>
 
     <template is="dom-if" if="[[showInternetConfig_]]" restamp>
-      <internet-config id="configDialog"
-          networking-private="[[networkingPrivate]]"
-          on-close="onInternetConfigClose_">
+      <internet-config id="configDialog" on-close="onInternetConfigClose_">
       </internet-config>
     </template>
 
diff --git a/chrome/browser/resources/settings/internet_page/internet_page.js b/chrome/browser/resources/settings/internet_page/internet_page.js
index 766629e..bd6463d0 100644
--- a/chrome/browser/resources/settings/internet_page/internet_page.js
+++ b/chrome/browser/resources/settings/internet_page/internet_page.js
@@ -22,14 +22,6 @@
   ],
 
   properties: {
-    /**
-     * Interface for networkingPrivate calls. May be overriden by tests.
-     * @type {NetworkingPrivate}
-     */
-    networkingPrivate: {
-      type: Object,
-      value: chrome.networkingPrivate,
-    },
 
     /** Preferences state. */
     prefs: {
@@ -145,12 +137,7 @@
   /** @private  {?settings.InternetPageBrowserProxy} */
   browserProxy_: null,
 
-  /**
-   * This UI will use both the networkingPrivate extension API and the
-   * networkConfig mojo API until we provide all of the required functionality
-   * in networkConfig. TODO(stevenjb): Remove use of networkingPrivate api.
-   * @private {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote}
-   */
+  /** @private {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
   networkConfig_: null,
 
   /** @override */
@@ -230,7 +217,7 @@
     }
   },
 
-  /** CrosNetworkConfigObserver impl */
+  /** CrNetworkListenerBehavior override */
   onVpnProvidersChanged: function() {
     this.networkConfig_.getVpnProviders().then(response => {
       const providers = response.providers;
diff --git a/chrome/browser/resources/settings/internet_page/internet_subpage.js b/chrome/browser/resources/settings/internet_page/internet_subpage.js
index 9996d3b6..c3fb9596 100644
--- a/chrome/browser/resources/settings/internet_page/internet_subpage.js
+++ b/chrome/browser/resources/settings/internet_page/internet_subpage.js
@@ -120,12 +120,7 @@
   /** @private  {settings.InternetPageBrowserProxy} */
   browserProxy_: null,
 
-  /**
-   * This UI will use both the networkingPrivate extension API and the
-   * networkConfig mojo API until we provide all of the required functionality
-   * in networkConfig. TODO(stevenjb): Remove use of networkingPrivate api.
-   * @private {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote}
-   */
+  /** @private {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
   networkConfig_: null,
 
   /** @override */
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 a7a9a7a..4542486 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
@@ -23,7 +23,8 @@
 void CreateNewEntry(content::WebContents* tab,
                     const std::string& target_device_name,
                     const std::string& target_device_guid,
-                    const GURL& link_url) {
+                    const GURL& link_url,
+                    bool show_notification) {
   DCHECK(tab);
 
   GURL shared_url = link_url;
@@ -60,6 +61,9 @@
   const SendTabToSelfEntry* entry =
       model->AddEntry(shared_url, title, navigation_time, target_device_guid);
 
+  if (!show_notification)
+    return;
+
   if (entry) {
     DesktopNotificationHandler(profile).DisplaySendingConfirmation(
         *entry, target_device_name);
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 c2940ea9..eae0d048 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,11 +37,13 @@
 
 enum SendTabToSelfMenuType { kTab, kOmnibox, kContent, kLink };
 
-// Adds a new entry to SendTabToSelfModel when user clicks a target device.
+// Adds a new entry to SendTabToSelfModel when user clicks a target device. Will
+// not show a confirmation notification if |show_notification| is false.
 void CreateNewEntry(content::WebContents* tab,
                     const std::string& target_device_name,
                     const std::string& target_device_guid,
-                    const GURL& link_url = GURL());
+                    const GURL& link_url = GURL(),
+                    bool show_notification = true);
 
 // Adds a new entry to SendTabToSelfModel when user clicks the single valid
 // device. Will be called when GetValidDeviceCount() == 1.
diff --git a/chrome/browser/sync/test/integration/profile_sync_service_harness.cc b/chrome/browser/sync/test/integration/profile_sync_service_harness.cc
index 7d2e1cd..514365f05 100644
--- a/chrome/browser/sync/test/integration/profile_sync_service_harness.cc
+++ b/chrome/browser/sync/test/integration/profile_sync_service_harness.cc
@@ -7,6 +7,7 @@
 #include <cstddef>
 #include <sstream>
 
+#include "base/command_line.h"
 #include "base/json/json_writer.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
@@ -26,10 +27,25 @@
 #include "components/signin/public/identity_manager/identity_test_utils.h"
 #include "components/sync/driver/about_sync_util.h"
 #include "components/sync/engine/sync_string_conversions.h"
+#include "components/sync/engine_impl/net/url_translator.h"
+#include "components/sync/engine_impl/traffic_logger.h"
+#include "components/sync/protocol/sync.pb.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/test/simple_url_loader_test_helper.h"
+#include "google_apis/google_api_keys.h"
+#include "net/base/net_errors.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
+#include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/network/public/cpp/simple_url_loader.h"
+#include "services/network/public/mojom/fetch_api.mojom-shared.h"
+#include "third_party/zlib/google/compression_utils.h"
 
 using syncer::ProfileSyncService;
 using syncer::SyncCycleSnapshot;
 
+const char* kSyncUrlClearServerDataKey = "sync-url-clear-server-data";
+
 namespace {
 
 bool HasAuthError(ProfileSyncService* service) {
@@ -172,6 +188,73 @@
   return false;
 }
 
+// Same as reset on chrome.google.com/sync.
+// This function will wait until the reset is done. If error occurs,
+// it will log error messages.
+void ResetAccount(network::SharedURLLoaderFactory* url_loader_factory,
+                  const std::string& access_token,
+                  const GURL& url,
+                  const std::string& username,
+                  const std::string& birthday) {
+  // Generate https POST payload.
+  sync_pb::ClientToServerMessage message;
+  message.set_share(username);
+  message.set_message_contents(
+      sync_pb::ClientToServerMessage::CLEAR_SERVER_DATA);
+  message.set_store_birthday(birthday);
+  message.set_api_key(google_apis::GetAPIKey());
+  syncer::LogClientToServerMessage(message);
+  std::string payload;
+  message.SerializeToString(&payload);
+  std::string request_to_send;
+  compression::GzipCompress(payload, &request_to_send);
+
+  auto resource_request = std::make_unique<network::ResourceRequest>();
+  resource_request->url = url;
+  resource_request->method = "POST";
+  resource_request->headers.SetHeader("Authorization",
+                                      "Bearer " + access_token);
+  resource_request->headers.SetHeader("Content-Encoding", "gzip");
+  resource_request->headers.SetHeader("Accept-Language", "en-US,en");
+  resource_request->credentials_mode = network::mojom::CredentialsMode::kOmit;
+  auto simple_loader = network::SimpleURLLoader::Create(
+      std::move(resource_request), TRAFFIC_ANNOTATION_FOR_TESTS);
+  simple_loader->AttachStringForUpload(request_to_send,
+                                       "application/octet-stream");
+  simple_loader->SetTimeoutDuration(base::TimeDelta::FromSeconds(10));
+  content::SimpleURLLoaderTestHelper url_loader_helper;
+  simple_loader->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
+      url_loader_factory, url_loader_helper.GetCallback());
+  url_loader_helper.WaitForCallback();
+  if (simple_loader->NetError() != 0) {
+    LOG(ERROR) << "Reset account failed with error "
+               << net::ErrorToString(simple_loader->NetError())
+               << ". The account will remain dirty and may cause test fail.";
+  }
+}
+
+void ProfileSyncServiceHarness::ResetSyncForPrimaryAccount() {
+  syncer::SyncPrefs sync_prefs(profile_->GetPrefs());
+  // Generate the https url.
+  // CLEAR_SERVER_DATA isn't enabled on the prod Sync server,
+  // so --sync-url-clear-server-data can be used to specify an
+  // alternative endpoint.
+  // Note: Any OTA(Owned Test Account) tries to clear data need to be
+  // whitelisted.
+  auto* cmd_line = base::CommandLine::ForCurrentProcess();
+  DCHECK(cmd_line->HasSwitch(kSyncUrlClearServerDataKey))
+      << "Missing switch " << kSyncUrlClearServerDataKey;
+  std::string url =
+      cmd_line->GetSwitchValueASCII(kSyncUrlClearServerDataKey) + "/command/?";
+  url += syncer::MakeSyncQueryString(sync_prefs.GetCacheGuid());
+
+  // Call sync server to clear sync data.
+  std::string access_token = service()->GetAccessTokenForTest();
+  DCHECK(access_token.size()) << "Access token is not available.";
+  ResetAccount(profile_->GetURLLoaderFactory().get(), access_token, GURL(url),
+               username_, sync_prefs.GetBirthday());
+}
+
 #if !defined(OS_CHROMEOS)
 void ProfileSyncServiceHarness::SignOutPrimaryAccount() {
   DCHECK(!username_.empty());
diff --git a/chrome/browser/sync/test/integration/profile_sync_service_harness.h b/chrome/browser/sync/test/integration/profile_sync_service_harness.h
index 7c23b4e1..45494452 100644
--- a/chrome/browser/sync/test/integration/profile_sync_service_harness.h
+++ b/chrome/browser/sync/test/integration/profile_sync_service_harness.h
@@ -47,6 +47,9 @@
   // Signs in to a primary account without actually enabling sync the feature.
   bool SignInPrimaryAccount();
 
+  // This is similar to click the reset button on chrome.google.com/sync.
+  void ResetSyncForPrimaryAccount();
+
 #if !defined(OS_CHROMEOS)
   // Signs out of the primary account. ChromeOS doesn't have the concept of
   // sign-out, so this only exists on other platforms.
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc
index 46563311..92bf9b5 100644
--- a/chrome/browser/sync/test/integration/sync_test.cc
+++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -357,7 +357,7 @@
   base::FilePath profile_path;
 
   base::ScopedAllowBlockingForTesting allow_blocking;
-  if (UsingExternalServers() && num_clients_ > 1) {
+  if (UsingExternalServers() && (num_clients_ > 1 || use_new_user_data_dir_)) {
     scoped_temp_dirs_.push_back(std::make_unique<base::ScopedTempDir>());
     // For multi profile UI signin, profile paths should be outside user data
     // dir to allow signing-in multiple profiles to same account. Otherwise, we
@@ -844,8 +844,17 @@
   }
 }
 
+void SyncTest::ClearProfiles() {
+  profiles_.clear();
+  profile_delegates_.clear();
+  scoped_temp_dirs_.clear();
+  browsers_.clear();
+  clients_.clear();
+}
+
 bool SyncTest::SetupSync() {
   base::ScopedAllowBlockingForTesting allow_blocking;
+
   SetupSyncInternal(/*setup_mode=*/WAIT_FOR_SYNC_SETUP_TO_COMPLETE);
 
   // Because clients may modify sync data as part of startup (for example
@@ -972,6 +981,25 @@
           }));
 }
 
+void SyncTest::ResetSyncForPrimaryAccount() {
+  if (UsingExternalServers()) {
+    base::ScopedAllowBlockingForTesting allow_blocking;
+    // For external server testing, we need to have a clean account.
+    // The following code will sign in one chrome browser, get
+    // the client id and access token, then clean the server data.
+    int old_num_clients = num_clients_;
+    int old_use_new_user_data_dir = use_new_user_data_dir_;
+    use_new_user_data_dir_ = true;
+    num_clients_ = 1;
+    SetupSyncInternal(/*setup_mode=*/WAIT_FOR_SYNC_SETUP_TO_COMPLETE);
+    GetClient(0)->ResetSyncForPrimaryAccount();
+    GetClient(0)->StopSyncServiceAndClearData();
+    ClearProfiles();
+    use_new_user_data_dir_ = old_use_new_user_data_dir;
+    num_clients_ = old_num_clients;
+  }
+}
+
 void SyncTest::SetUpOnMainThread() {
   // Start up a sync test server if one is needed and setup mock gaia responses.
   // Note: This must be done prior to the call to SetupClients() because we want
diff --git a/chrome/browser/sync/test/integration/sync_test.h b/chrome/browser/sync/test/integration/sync_test.h
index d6f4e22..2e91c19 100644
--- a/chrome/browser/sync/test/integration/sync_test.h
+++ b/chrome/browser/sync/test/integration/sync_test.h
@@ -212,6 +212,12 @@
   // Initializes sync clients and profiles if required and syncs each of them.
   virtual bool SetupSync() WARN_UNUSED_RESULT;
 
+  // This is similar to click the reset button on chrome.google.com/sync.
+  // Only takes effect when running with external servers.
+  // Please call this before setting anything. This method will clear all
+  // local profiles, browsers, etc.
+  void ResetSyncForPrimaryAccount();
+
   // Like SetupSync() but does not wait for the clients to be ready to sync.
   void SetupSyncNoWaitingForCompletion();
 
@@ -405,6 +411,8 @@
   // Internal routine for setting up sync.
   void SetupSyncInternal(SetupSyncMode setup_mode);
 
+  void ClearProfiles();
+
   // GAIA account used by the test case.
   std::string username_;
 
@@ -493,6 +501,10 @@
   // profile or not.
   bool use_verifier_;
 
+  // Indicates whether to use a new user data dir.
+  // Only used for external server tests with two clients.
+  bool use_new_user_data_dir_ = false;
+
   // Indicates the need to create Gaia user account at runtime. This can only
   // be set if tests are run against external servers with support for user
   // creation via http requests.
diff --git a/chrome/browser/sync/test/integration/two_client_typed_urls_sync_test.cc b/chrome/browser/sync/test/integration/two_client_typed_urls_sync_test.cc
index 31c9057a..36ee9d4 100644
--- a/chrome/browser/sync/test/integration/two_client_typed_urls_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_typed_urls_sync_test.cc
@@ -37,7 +37,7 @@
 using typed_urls_helper::RemoveVisitsFromClient;
 
 namespace {
-const std::string kDummyUrl = "http://dummy-history.google.com/";
+const char kDummyUrl[] = "http://dummy-history.google.com/";
 }  // namespace
 
 class TwoClientTypedUrlsSyncTest : public SyncTest {
@@ -655,6 +655,7 @@
   const base::string16 kHistoryUrl(ASCIIToUTF16("http://typed.google.com/"));
   const base::string16 kRedirectedHistoryUrl(
       ASCIIToUTF16("http://www.typed.google.com/"));
+  ResetSyncForPrimaryAccount();
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
 
   // Simulate a typed address that gets redirected by the server to a different
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 6c4a1c1..14cac917c6 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -3492,8 +3492,6 @@
       "app_list/search/drive_quick_access_result.h",
       "app_list/search/extension_app_result.cc",
       "app_list/search/extension_app_result.h",
-      "app_list/search/logging/search_ranking_event_logger.cc",
-      "app_list/search/logging/search_ranking_event_logger.h",
       "app_list/search/mixer.cc",
       "app_list/search/mixer.h",
       "app_list/search/omnibox_provider.cc",
@@ -3538,6 +3536,8 @@
       "app_list/search/search_result_ranker/recurrence_ranker.h",
       "app_list/search/search_result_ranker/recurrence_ranker_util.cc",
       "app_list/search/search_result_ranker/recurrence_ranker_util.h",
+      "app_list/search/search_result_ranker/search_ranking_event_logger.cc",
+      "app_list/search/search_result_ranker/search_ranking_event_logger.h",
       "app_list/search/search_result_ranker/search_result_ranker.cc",
       "app_list/search/search_result_ranker/search_result_ranker.h",
       "app_list/search/search_utils/fuzzy_tokenized_string_match.cc",
@@ -3561,7 +3561,6 @@
       "//ash/app_list",
       "//ash/public/cpp/app_list/vector_icons",
       "//ash/resources/vector_icons",
-      "//chrome/browser/ui/app_list/search/logging:search_ranking_event_proto",
       "//chrome/browser/ui/app_list/search/search_result_ranker:app_launch_event_logger_proto",
       "//chrome/browser/ui/app_list/search/search_result_ranker:app_launch_predictor_proto",
       "//chrome/browser/ui/app_list/search/search_result_ranker:app_list_launch_recorder_proto",
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 0faf7dac..8b98613 100644
--- a/chrome/browser/ui/app_list/app_list_client_impl.h
+++ b/chrome/browser/ui/app_list/app_list_client_impl.h
@@ -21,7 +21,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/scoped_observer.h"
 #include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
-#include "chrome/browser/ui/app_list/search/logging/search_ranking_event_logger.h"
+#include "chrome/browser/ui/app_list/search/search_result_ranker/search_ranking_event_logger.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/search_engines/template_url_service_observer.h"
 #include "components/user_manager/user_manager.h"
diff --git a/chrome/browser/ui/app_list/search/logging/BUILD.gn b/chrome/browser/ui/app_list/search/logging/BUILD.gn
deleted file mode 100644
index d2fbed1..0000000
--- a/chrome/browser/ui/app_list/search/logging/BUILD.gn
+++ /dev/null
@@ -1,11 +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.
-
-import("//third_party/protobuf/proto_library.gni")
-
-proto_library("search_ranking_event_proto") {
-  sources = [
-    "search_ranking_event.proto",
-  ]
-}
diff --git a/chrome/browser/ui/app_list/search/logging/OWNERS b/chrome/browser/ui/app_list/search/logging/OWNERS
deleted file mode 100644
index a356eeb..0000000
--- a/chrome/browser/ui/app_list/search/logging/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-jiameng@chromium.org
-
-# COMPONENT: UI>Shell>Launcher
diff --git a/chrome/browser/ui/app_list/search/logging/search_ranking_event.proto b/chrome/browser/ui/app_list/search/logging/search_ranking_event.proto
deleted file mode 100644
index 791ab28..0000000
--- a/chrome/browser/ui/app_list/search/logging/search_ranking_event.proto
+++ /dev/null
@@ -1,92 +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.
-
-syntax = "proto2";
-
-option optimize_for = LITE_RUNTIME;
-
-package app_list;
-
-// Some enums that will be used for both SearchRankingZeroStateEvent and
-// SearchRankingQueryEvent.
-enum CategoryID {
-  UNKNOWN_CATEGORY_ID = 0;
-  ANSWER_CARD = 1;
-  RECENT_QUERY = 2;
-  WEB_RESULT = 3;
-  BOOKMARK = 4;
-  RECENTLY_VISITED_URL = 5;
-  DRIVE_FILE = 6;
-  LOCAL_FILE = 7;
-}
-
-enum FileExtension {
-  UNKNOWN_FILE_EXTENSION = 0;
-  DOCS = 1;
-  SHEETS = 2;
-  SLIDES = 3;
-  FORMS = 4;
-  DRAWINGS = 5;
-}
-
-enum DayOfWeek {
-  SUN = 0;
-  MON = 1;
-  TUE = 2;
-  WED = 3;
-  THU = 4;
-  FRI = 5;
-  SAT = 6;
-}
-
-enum DeviceMode {
-  CLAMSHELL = 0;
-  TABLET = 1;
-}
-
-// SearchRankingZeroStateEvent contains features and related information for the
-// Chrome OS Search and Ranking project. These will be used for zero-state
-// recommendations.
-message SearchRankingZeroStateEvent {
-  // Contain features about a specific item.
-  message Features {
-    // Type of the item.
-    optional CategoryID category_id = 1;
-    // Extension of the file. Only available if category_id is DRIVE_FILE or
-    // LOCAL_FILE.
-    optional FileExtension file_extension = 2;
-    // Day of the week. Sunday is 0.
-    optional DayOfWeek day_of_week = 3;
-    // Position of the item. Topmost is position 1.
-    optional int32 position = 4;
-    // Last usage time as hours since midnight in the local time zone. For
-    // previous queries, it is the time the user clicked on it on the
-    // same Chrome device.
-    optional int32 last_usage_time = 5;
-    // Time since the item was last used/clicked. This is a duration timestamp
-    // and will be in seconds.
-    optional int32 time_since_last_use = 6;
-    // Number of clicks each hour as bucketed by the hour.
-    optional int32 num_clicks_each_hour = 7;
-    // Physical device mode, e.g. TABLET, CLAMSHELL.
-    optional DeviceMode device_mode = 8;
-    // Bucketed previous query length
-    optional int32 query_length = 9;
-  }
-
-  // Information related to a specific event.
-  message Event {
-    // Identifier used to associate all recommended items that were shown to the
-    // user.
-    optional int32 event_id = 1;
-    // Event time as hours since midnight in the local time zone. This is
-    // absolute timestamp and will be in hours.
-    optional int32 event_time = 2;
-    // Whether the item is clicked.
-    optional bool is_clicked = 3;
-  }
-
-  optional Features features = 1;
-  optional Event event = 2;
-}
diff --git a/chrome/browser/ui/app_list/search/logging/search_ranking_event_logger.cc b/chrome/browser/ui/app_list/search/search_result_ranker/search_ranking_event_logger.cc
similarity index 98%
rename from chrome/browser/ui/app_list/search/logging/search_ranking_event_logger.cc
rename to chrome/browser/ui/app_list/search/search_result_ranker/search_ranking_event_logger.cc
index dfee341..23b9896b 100644
--- a/chrome/browser/ui/app_list/search/logging/search_ranking_event_logger.cc
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/search_ranking_event_logger.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/app_list/search/logging/search_ranking_event_logger.h"
+#include "chrome/browser/ui/app_list/search/search_result_ranker/search_ranking_event_logger.h"
 
 #include <cmath>
 
diff --git a/chrome/browser/ui/app_list/search/logging/search_ranking_event_logger.h b/chrome/browser/ui/app_list/search/search_result_ranker/search_ranking_event_logger.h
similarity index 93%
rename from chrome/browser/ui/app_list/search/logging/search_ranking_event_logger.h
rename to chrome/browser/ui/app_list/search/search_result_ranker/search_ranking_event_logger.h
index 7a65eb68..418bb89 100644
--- a/chrome/browser/ui/app_list/search/logging/search_ranking_event_logger.h
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/search_ranking_event_logger.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_LOGGING_SEARCH_RANKING_EVENT_LOGGER_H_
-#define CHROME_BROWSER_UI_APP_LIST_SEARCH_LOGGING_SEARCH_RANKING_EVENT_LOGGER_H_
+#ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_SEARCH_RESULT_RANKER_SEARCH_RANKING_EVENT_LOGGER_H_
+#define CHROME_BROWSER_UI_APP_LIST_SEARCH_SEARCH_RESULT_RANKER_SEARCH_RANKING_EVENT_LOGGER_H_
 
 #include <map>
 #include <string>
@@ -117,4 +117,4 @@
 
 }  // namespace app_list
 
-#endif  // CHROME_BROWSER_UI_APP_LIST_SEARCH_LOGGING_SEARCH_RANKING_EVENT_LOGGER_H_
+#endif  // CHROME_BROWSER_UI_APP_LIST_SEARCH_SEARCH_RESULT_RANKER_SEARCH_RANKING_EVENT_LOGGER_H_
diff --git a/chrome/browser/ui/app_list/search/logging/search_ranking_event_logger_unittest.cc b/chrome/browser/ui/app_list/search/search_result_ranker/search_ranking_event_logger_unittest.cc
similarity index 98%
rename from chrome/browser/ui/app_list/search/logging/search_ranking_event_logger_unittest.cc
rename to chrome/browser/ui/app_list/search/search_result_ranker/search_ranking_event_logger_unittest.cc
index f142603..2ef736b 100644
--- a/chrome/browser/ui/app_list/search/logging/search_ranking_event_logger_unittest.cc
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/search_ranking_event_logger_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/app_list/search/logging/search_ranking_event_logger.h"
+#include "chrome/browser/ui/app_list/search/search_result_ranker/search_ranking_event_logger.h"
 
 #include <map>
 #include <memory>
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 536aa8c..b569965 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -526,6 +526,11 @@
   registrar_.RemoveAll();
   extension_browser_window_helper_.reset();
 
+  // Like above, cancel delayed method calls into |this| to avoid re-entrancy.
+  // This is necessary because ~TestingProfile (called below for incognito
+  // |profile_|) spins a RunLoop.
+  weak_factory_.InvalidateWeakPtrs();
+
   // The tab strip should not have any tabs at this point.
   DCHECK(tab_strip_model_->empty());
   bubble_manager_.reset();
diff --git a/chrome/browser/ui/cocoa/main_menu_builder.mm b/chrome/browser/ui/cocoa/main_menu_builder.mm
index b0f66cc..4d0dc2f 100644
--- a/chrome/browser/ui/cocoa/main_menu_builder.mm
+++ b/chrome/browser/ui/cocoa/main_menu_builder.mm
@@ -340,9 +340,6 @@
     id app_delegate,
     const base::string16& product_name,
     bool is_pwa) {
-  if (is_pwa)
-    return base::scoped_nsobject<NSMenuItem>();
-
   base::scoped_nsobject<NSMenuItem> item = Item(IDS_PROFILES_OPTIONS_GROUP_NAME)
                                                .tag(IDC_PROFILE_MAIN_MENU)
                                                .submenu({})
diff --git a/chrome/browser/ui/cocoa/nsmenuitem_additions.h b/chrome/browser/ui/cocoa/nsmenuitem_additions.h
index 05129d4..84254464 100644
--- a/chrome/browser/ui/cocoa/nsmenuitem_additions.h
+++ b/chrome/browser/ui/cocoa/nsmenuitem_additions.h
@@ -18,6 +18,11 @@
 
 // Used by tests to set internal state without having to change global input
 // source.
-void SetIsInputSourceDvorakQwertyForTesting(bool is_dvorak_qwerty);
+void SetIsInputSourceCommandQwertyForTesting(bool is_command_qwerty);
+
+// Returns whether the named keyboard layout has the command-qwerty behavior,
+// meaning that the layout acts as though it was QWERTY when the command key is
+// held.
+bool IsKeyboardLayoutCommandQwerty(NSString* layout_id);
 
 #endif  // CHROME_BROWSER_UI_COCOA_NSMENUITEM_ADDITIONS_H_
diff --git a/chrome/browser/ui/cocoa/nsmenuitem_additions.mm b/chrome/browser/ui/cocoa/nsmenuitem_additions.mm
index 040e05d..8669343 100644
--- a/chrome/browser/ui/cocoa/nsmenuitem_additions.mm
+++ b/chrome/browser/ui/cocoa/nsmenuitem_additions.mm
@@ -11,11 +11,16 @@
 #include "ui/events/keycodes/keyboard_code_conversion_mac.h"
 
 namespace {
-bool g_is_input_source_dvorak_qwerty = false;
+bool g_is_input_source_command_qwerty = false;
 }  // namespace
 
-void SetIsInputSourceDvorakQwertyForTesting(bool is_dvorak_qwerty) {
-  g_is_input_source_dvorak_qwerty = is_dvorak_qwerty;
+void SetIsInputSourceCommandQwertyForTesting(bool is_command_qwerty) {
+  g_is_input_source_command_qwerty = is_command_qwerty;
+}
+
+bool IsKeyboardLayoutCommandQwerty(NSString* layout_id) {
+  return [layout_id isEqualToString:@"com.apple.keylayout.DVORAK-QWERTYCMD"] ||
+         [layout_id isEqualToString:@"com.apple.keylayout.Dhivehi-QWERTY"];
 }
 
 @interface KeyboardInputSourceListener : NSObject
@@ -43,10 +48,9 @@
 - (void)updateInputSource {
   base::ScopedCFTypeRef<TISInputSourceRef> inputSource(
       TISCopyCurrentKeyboardInputSource());
-  NSString* inputSourceID = (NSString*)TISGetInputSourceProperty(
+  NSString* layoutId = (NSString*)TISGetInputSourceProperty(
       inputSource.get(), kTISPropertyInputSourceID);
-  g_is_input_source_dvorak_qwerty =
-      [inputSourceID isEqualToString:@"com.apple.keylayout.DVORAK-QWERTYCMD"];
+  g_is_input_source_command_qwerty = IsKeyboardLayoutCommandQwerty(layoutId);
 }
 
 - (void)inputSourceDidChange:(NSNotification*)notification {
@@ -132,11 +136,11 @@
       [[KeyboardInputSourceListener alloc] init];
 
   // We typically want to compare [NSMenuItem keyEquivalent] against [NSEvent
-  // charactersIgnoringModifiers]. There is a special keyboard layout "Dvorak -
-  // QWERTY" which uses QWERTY-style shortcuts when the Command key is held
-  // down. In this case, we want to use the keycode of the event rather than
-  // looking at the characters.
-  if (g_is_input_source_dvorak_qwerty) {
+  // charactersIgnoringModifiers]. There are special command-qwerty layouts
+  // (such as DVORAK-QWERTY) which use QWERTY-style shortcuts when the Command
+  // key is held down. In this case, we want to use the keycode of the event
+  // rather than looking at the characters.
+  if (g_is_input_source_command_qwerty) {
     ui::KeyboardCode windows_keycode =
         ui::KeyboardCodeFromKeyCode(event.keyCode);
     unichar shifted_character, character;
diff --git a/chrome/browser/ui/cocoa/nsmenuitem_additions_unittest.mm b/chrome/browser/ui/cocoa/nsmenuitem_additions_unittest.mm
index 656df36..15fd16ba 100644
--- a/chrome/browser/ui/cocoa/nsmenuitem_additions_unittest.mm
+++ b/chrome/browser/ui/cocoa/nsmenuitem_additions_unittest.mm
@@ -46,6 +46,15 @@
   return out << "NSMenuItem " << base::SysNSStringToUTF8([item keyEquivalent]);
 }
 
+// Returns whether a keyboard layout is one of the "commandless" cyrillic
+// layouts introduced in 10.15: these layouts do not ever fire key equivalents
+// (in any app, not just Chrome) and appear not to be intended for full-time
+// use.
+bool IsCommandlessCyrillicLayout(NSString* layoutId) {
+  return [layoutId isEqualToString:@"com.apple.keylayout.Kyrgyz-Cyrillic"] ||
+         [layoutId isEqualToString:@"com.apple.keylayout.Mongolian-Cyrillic"];
+}
+
 void ExpectKeyFiresItemEq(bool result, NSEvent* key, NSMenuItem* item,
     bool compareCocoa) {
   EXPECT_EQ(result, [item cr_firesForKeyEvent:key]) << key << '\n' << item;
@@ -267,8 +276,8 @@
   ExpectKeyDoesntFireItem(key, MenuItem(@"z", 0x100000));
   ExpectKeyFiresItem(key, MenuItem(@";", 0x100000));
 
-  // Change to Dvorak-QWERTY
-  SetIsInputSourceDvorakQwertyForTesting(true);
+  // Change to Command-QWERTY
+  SetIsInputSourceCommandQwertyForTesting(true);
 
   // cmd-z on dvorak qwerty layout (so that the key produces ';', but 'z' if
   // cmd is down)
@@ -296,8 +305,8 @@
                      false);
   ExpectKeyDoesntFireItem(key, MenuItem(@"\x9", NSControlKeyMask), false);
 
-  // Change away from Dvorak-QWERTY
-  SetIsInputSourceDvorakQwertyForTesting(false);
+  // Change away from Command-QWERTY
+  SetIsInputSourceCommandQwertyForTesting(false);
 
   // cmd-shift-z on dvorak layout (so that we get a ':')
   key = KeyEvent(0x12010a, @";", @":", 6);
@@ -417,10 +426,14 @@
       // to trigger a keyEquivalent, since then it won't be possible to type
       // "m".
       continue;
+    } else if (IsCommandlessCyrillicLayout(layoutId)) {
+      // Commandless layouts have no way to trigger a menu key equivalent at
+      // all, in any app.
+      continue;
     }
 
-    if ([layoutId isEqualToString:@"com.apple.keylayout.DVORAK-QWERTYCMD"]) {
-      SetIsInputSourceDvorakQwertyForTesting(true);
+    if (IsKeyboardLayoutCommandQwerty(layoutId)) {
+      SetIsInputSourceCommandQwertyForTesting(true);
     }
 
     EventModifiers modifiers = cmdKey >> 8;
@@ -438,8 +451,8 @@
       ExpectKeyFiresItem(key, item, false);
     }
 
-    if ([layoutId isEqualToString:@"com.apple.keylayout.DVORAK-QWERTYCMD"]) {
-      SetIsInputSourceDvorakQwertyForTesting(false);
+    if (IsKeyboardLayoutCommandQwerty(layoutId)) {
+      SetIsInputSourceCommandQwertyForTesting(false);
     }
   }
   CFRelease(list);
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 6083b88..5dc3623d 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
@@ -68,9 +68,6 @@
 }
 
 Profile* SendTabToSelfBubbleController::GetProfile() const {
-  if (!web_contents_) {
-    return nullptr;
-  }
   return Profile::FromBrowserContext(web_contents_->GetBrowserContext());
 }
 
@@ -79,7 +76,10 @@
     const std::string& target_device_guid) {
   RecordSendTabToSelfClickResult(kOmniboxIcon,
                                  SendTabToSelfClickResult::kClickItem);
-  CreateNewEntry(web_contents_, target_device_name, target_device_guid);
+  CreateNewEntry(web_contents_, target_device_name, target_device_guid, GURL(),
+                 false);
+  show_message_ = true;
+  UpdateIcon();
 }
 
 void SendTabToSelfBubbleController::OnBubbleClosed() {
@@ -91,9 +91,15 @@
 SendTabToSelfBubbleController::SendTabToSelfBubbleController(
     content::WebContents* web_contents)
     : web_contents_(web_contents) {
+  DCHECK(web_contents);
   FetchDeviceInfo();
 }
 
+void SendTabToSelfBubbleController::UpdateIcon() {
+  Browser* browser = chrome::FindBrowserWithWebContents(web_contents_);
+  browser->window()->UpdatePageActionIcon(PageActionIconType::kSendTabToSelf);
+}
+
 void SendTabToSelfBubbleController::FetchDeviceInfo() {
   valid_devices_.clear();
   SendTabToSelfSyncService* service =
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 5ae3ddb..c6cdec9 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
@@ -51,6 +51,9 @@
   // Close the bubble when the user click on the close button.
   void OnBubbleClosed();
 
+  bool show_message() const { return show_message_; }
+  void set_show_message(bool show_message) { show_message_ = show_message; }
+
  protected:
   SendTabToSelfBubbleController();
   explicit SendTabToSelfBubbleController(content::WebContents* web_contents);
@@ -61,14 +64,20 @@
   FRIEND_TEST_ALL_PREFIXES(SendTabToSelfBubbleViewImplTest, PopulateScrollView);
   FRIEND_TEST_ALL_PREFIXES(SendTabToSelfBubbleViewImplTest, DevicePressed);
 
+  // Updates the omnibox icon if available.
+  void UpdateIcon();
+
   // Get information of valid devices.
   void FetchDeviceInfo();
+
   // The web_contents associated with this controller.
   content::WebContents* web_contents_;
   // Weak reference. Will be nullptr if no bubble is currently shown.
   SendTabToSelfBubbleView* send_tab_to_self_bubble_view_ = nullptr;
   // Valid devices data.
   std::vector<TargetDeviceInfo> valid_devices_;
+  // True if a confirmation message should be shown in the omnibox.
+  bool show_message_ = false;
 
   WEB_CONTENTS_USER_DATA_KEY_DECL();
 
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc
index f97342b..b0909e2 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc
@@ -371,7 +371,7 @@
 
   // The window has a reasonable size.
   gfx::Rect actual_bounds = settings_browser->window()->GetBounds();
-  EXPECT_LE(200, actual_bounds.width());
+  EXPECT_LE(300, actual_bounds.width());
   EXPECT_LE(100, actual_bounds.height());
 }
 
diff --git a/chrome/browser/ui/views/hats/hats_bubble_view.cc b/chrome/browser/ui/views/hats/hats_bubble_view.cc
index e1637b9..92eaac3 100644
--- a/chrome/browser/ui/views/hats/hats_bubble_view.cc
+++ b/chrome/browser/ui/views/hats/hats_bubble_view.cc
@@ -172,15 +172,17 @@
   instance_ = nullptr;
 }
 
-void HatsBubbleView::Layout() {
+void HatsBubbleView::OnBoundsChanged(const gfx::Rect& previous_bounds) {
   auto* frame_view = GetBubbleFrameView();
   if (frame_view && frame_view->title()) {
     // Align bubble content to the beginning of the title text.
     gfx::Point point(frame_view->title()->x(), 0);
     views::View::ConvertPointToTarget(frame_view, GetWidget()->client_view(),
                                       &point);
-    SetX(point.x());
+    auto dialog_margins = margins();
+    dialog_margins.set_left(point.x());
+    set_margins(dialog_margins);
   }
 
-  views::BubbleDialogDelegateView::Layout();
+  views::BubbleDialogDelegateView::OnBoundsChanged(previous_bounds);
 }
diff --git a/chrome/browser/ui/views/hats/hats_bubble_view.h b/chrome/browser/ui/views/hats/hats_bubble_view.h
index a759b51..871d48d 100644
--- a/chrome/browser/ui/views/hats/hats_bubble_view.h
+++ b/chrome/browser/ui/views/hats/hats_bubble_view.h
@@ -62,7 +62,7 @@
   void OnWidgetDestroying(views::Widget* widget) override;
 
   // views::View:
-  void Layout() override;
+  void OnBoundsChanged(const gfx::Rect& previous_bounds) override;
 
  private:
   HatsBubbleView(Browser* browser,
diff --git a/chrome/browser/ui/views/location_bar/icon_label_bubble_view.cc b/chrome/browser/ui/views/location_bar/icon_label_bubble_view.cc
index 870d2297..9423376 100644
--- a/chrome/browser/ui/views/location_bar/icon_label_bubble_view.cc
+++ b/chrome/browser/ui/views/location_bar/icon_label_bubble_view.cc
@@ -368,15 +368,18 @@
   // as long as the animation is still shrinking.
   if (ShouldShowLabel() || shrinking) {
     // |multiplier| grows from zero to one, stays equal to one and then shrinks
-    // to zero again. The view width should correspondingly grow from zero to
-    // fully showing both label and icon, stay there, then shrink to just large
-    // enough to show the icon. We don't want to shrink all the way back to
-    // zero, since this would mean the view would completely disappear and then
-    // pop back to an icon after the animation finishes.
+    // to zero again. The view width should correspondingly grow from the
+    // original width before animation started to fully showing both label and
+    // icon, stay there, then shrink to just large enough to show the icon. We
+    // don't want to shrink all the way back to zero, since this would mean the
+    // view would completely disappear and then pop back to an icon after the
+    // animation finishes.
     const int max_width = size.width() + GetInternalSpacing() + label_width;
     const int current_width = WidthMultiplier() * max_width;
-    size.set_width(shrinking ? std::max(current_width, size.width())
-                             : current_width);
+    size.set_width(
+        shrinking ? std::max(current_width, size.width())
+                  : std::min(current_width + grow_animation_starting_width_,
+                             max_width));
   }
   return size;
 }
@@ -424,6 +427,9 @@
 
 void IconLabelBubbleView::AnimateIn(base::Optional<int> string_id) {
   if (!label()->GetVisible()) {
+    // Start animation from the current width, otherwise the icon will also be
+    // included if visible.
+    grow_animation_starting_width_ = width();
     if (string_id)
       SetLabel(l10n_util::GetStringUTF16(string_id.value()));
     label()->SetVisible(true);
diff --git a/chrome/browser/ui/views/location_bar/icon_label_bubble_view.h b/chrome/browser/ui/views/location_bar/icon_label_bubble_view.h
index d88c9dd..3acd5e1 100644
--- a/chrome/browser/ui/views/location_bar/icon_label_bubble_view.h
+++ b/chrome/browser/ui/views/location_bar/icon_label_bubble_view.h
@@ -98,6 +98,10 @@
     next_element_interior_padding_ = padding;
   }
 
+  void set_grow_animation_starting_width_for_testing(int width) {
+    grow_animation_starting_width_ = width;
+  }
+
   // Reduces the slide duration to 1ms such that animation still follows
   // through in the code but is short enough that it is essentially skipped.
   void ReduceAnimationTimeForTesting();
@@ -238,6 +242,9 @@
   bool is_animation_paused_ = false;
   double pause_animation_state_ = 0.0;
   double open_state_fraction_ = 0.0;
+  // This is used to offset the label animation by the current width (e.g. the
+  // icon). Set before animation begins in AnimateIn().
+  int grow_animation_starting_width_ = 0;
 
   ScopedObserver<ui::MaterialDesignController,
                  ui::MaterialDesignControllerObserver>
diff --git a/chrome/browser/ui/views/location_bar/icon_label_bubble_view_unittest.cc b/chrome/browser/ui/views/location_bar/icon_label_bubble_view_unittest.cc
index 969d481..27b0fc0 100644
--- a/chrome/browser/ui/views/location_bar/icon_label_bubble_view_unittest.cc
+++ b/chrome/browser/ui/views/location_bar/icon_label_bubble_view_unittest.cc
@@ -152,8 +152,8 @@
     ChromeViewsTestBase::TearDown();
   }
 
-  void VerifyWithAnimationStep(int step) {
-    Reset();
+  void VerifyWithAnimationStep(int step, bool icon_visible) {
+    Reset(icon_visible);
     for (int value = 0; value < kNumberOfSteps; value += step) {
       SetValue(value);
       VerifyAnimationStep();
@@ -183,16 +183,18 @@
     widget_->Init(std::move(params));
   }
 
-  void Reset() {
+  void Reset(bool icon_visible) {
     view_->SetLabelVisible(true);
     SetValue(0);
     steady_reached_ = false;
     shrinking_reached_ = false;
     minimum_size_reached_ = false;
-    previous_width_ = 0;
     initial_image_x_ = GetImageBounds().x();
     EXPECT_EQ(GetLayoutInsets(LOCATION_BAR_ICON_INTERIOR_PADDING).left(),
               initial_image_x_);
+
+    previous_width_ = icon_visible ? initial_image_x_ : 0;
+    view_->set_grow_animation_starting_width_for_testing(previous_width_);
   }
 
   void VerifyAnimationStep() {
@@ -280,10 +282,21 @@
 // size.
 // Various step sizes during animation simulate different possible timing.
 TEST_F(IconLabelBubbleViewTest, AnimateLayout) {
-  VerifyWithAnimationStep(1);
-  VerifyWithAnimationStep(5);
-  VerifyWithAnimationStep(10);
-  VerifyWithAnimationStep(25);
+  VerifyWithAnimationStep(1, false);
+  VerifyWithAnimationStep(5, false);
+  VerifyWithAnimationStep(10, false);
+  VerifyWithAnimationStep(25, false);
+}
+
+// Like AnimateLayout, tests layout rules while simulating animation, except
+// with the icon initially visible.
+// The animation is first growing the bubble from the image size, then keeping
+// its size constant and finally shrinking it down to the initial size.
+TEST_F(IconLabelBubbleViewTest, AnimateLayoutWithVisibleIcon) {
+  VerifyWithAnimationStep(1, true);
+  VerifyWithAnimationStep(5, true);
+  VerifyWithAnimationStep(10, true);
+  VerifyWithAnimationStep(25, true);
 }
 
 // Verify that clicking the view a second time hides its bubble.
diff --git a/chrome/browser/ui/views/passwords/credentials_item_view.cc b/chrome/browser/ui/views/passwords/credentials_item_view.cc
index fa3ea8f..361017c 100644
--- a/chrome/browser/ui/views/passwords/credentials_item_view.cc
+++ b/chrome/browser/ui/views/passwords/credentials_item_view.cc
@@ -143,10 +143,6 @@
     lower_label_->SetEnabledColor(color);
 }
 
-void CredentialsItemView::SetHoverColor(SkColor color) {
-  hover_color_ = color;
-}
-
 int CredentialsItemView::GetPreferredHeight() const {
   return GetPreferredSize().height();
 }
diff --git a/chrome/browser/ui/views/passwords/credentials_item_view.h b/chrome/browser/ui/views/passwords/credentials_item_view.h
index f0aa0f7..69bc9fd3 100644
--- a/chrome/browser/ui/views/passwords/credentials_item_view.h
+++ b/chrome/browser/ui/views/passwords/credentials_item_view.h
@@ -51,7 +51,6 @@
   void UpdateAvatar(const gfx::ImageSkia& image) override;
 
   void SetLowerLabelColor(SkColor color);
-  void SetHoverColor(SkColor color);
 
   int GetPreferredHeight() const;
 
diff --git a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_icon_view.cc b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_icon_view.cc
index 1a58092f..88f5794 100644
--- a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_icon_view.cc
+++ b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_icon_view.cc
@@ -14,6 +14,7 @@
 #include "components/omnibox/browser/omnibox_edit_model.h"
 #include "components/omnibox/browser/omnibox_view.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/strings/grit/ui_strings.h"
 
 namespace send_tab_to_self {
 
@@ -51,24 +52,30 @@
   }
 
   if (was_visible) {
-    // If send tab to self icon is showing:
-    // Hides the icon if the url is being editing.
     if (omnibox_view->model()->user_input_in_progress()) {
       SetVisible(false);
+    } else {
+      SendTabToSelfBubbleController* controller = GetController();
+      if (controller && controller->show_message()) {
+        controller->set_show_message(false);
+        if (initial_animation_state_ == AnimationState::kShowing &&
+            label()->GetVisible()) {
+          initial_animation_state_ = AnimationState::kShown;
+          SetLabel(l10n_util::GetStringUTF16(
+              IDS_BROWSER_SHARING_OMNIBOX_SENDING_LABEL));
+        } else {
+          AnimateIn(IDS_BROWSER_SHARING_OMNIBOX_SENDING_LABEL);
+        }
+      }
     }
   } else {
-    // If send tab to self icon is hiding:
-    // Shows the send tab to self icon in omnibox when:
-    // send tab to self feature offered, and
-    // mouse focuses on the omnibox, and
-    // url has not been changed.
     if (send_tab_to_self::ShouldOfferFeature(web_contents) &&
         omnibox_view->model()->has_focus() &&
         !omnibox_view->model()->user_input_in_progress()) {
-      // Shows the animation one time per window.
-      if (!was_animation_shown_) {
+      // Shows the "Send" animation one time per window.
+      if (initial_animation_state_ == AnimationState::kNotShown) {
         AnimateIn(IDS_OMNIBOX_ICON_SEND_TAB_TO_SELF);
-        was_animation_shown_ = true;
+        initial_animation_state_ = AnimationState::kShowing;
       }
       SetVisible(true);
     }
@@ -104,7 +111,8 @@
 }
 
 void SendTabToSelfIconView::AnimationEnded(const gfx::Animation* animation) {
-  IconLabelBubbleView::AnimationEnded(animation);
+  PageActionIconView::AnimationEnded(animation);
+  initial_animation_state_ = AnimationState::kShown;
 }
 
 }  // namespace send_tab_to_self
diff --git a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_icon_view.h b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_icon_view.h
index 08c103c6..5587045 100644
--- a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_icon_view.h
+++ b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_icon_view.h
@@ -28,17 +28,21 @@
   SkColor GetTextColor() const override;
   base::string16 GetTextForTooltipAndAccessibleName() const override;
 
+  // gfx::AnimationDelegate:
+  void AnimationEnded(const gfx::Animation* animation) override;
+
  protected:
   // PageActionIconView:
   void OnExecuting(PageActionIconView::ExecuteSource execute_source) override;
   const gfx::VectorIcon& GetVectorIcon() const override;
 
  private:
+  enum class AnimationState { kNotShown, kShowing, kShown };
+
   SendTabToSelfBubbleController* GetController() const;
-  // gfx::AnimationDelegate:
-  void AnimationEnded(const gfx::Animation* animation) override;
-  // Whether the animation has been shown.
-  bool was_animation_shown_ = false;
+
+  // Indicates the current state of the initial "Send" animation.
+  AnimationState initial_animation_state_ = AnimationState::kNotShown;
 
   DISALLOW_COPY_AND_ASSIGN(SendTabToSelfIconView);
 };
diff --git a/chrome/browser/ui/views/sharing/sharing_icon_view.cc b/chrome/browser/ui/views/sharing/sharing_icon_view.cc
index e89718b..ecf1a3c 100644
--- a/chrome/browser/ui/views/sharing/sharing_icon_view.cc
+++ b/chrome/browser/ui/views/sharing/sharing_icon_view.cc
@@ -12,10 +12,6 @@
 #include "ui/views/animation/ink_drop.h"
 
 namespace {
-// TODO(knollr): move these into IconLabelBubbleView.
-constexpr int kIconTextSpacing = 8;
-constexpr int kIconTextSpacingTouch = 10;
-
 // Progress state when the full length of the animation text is visible.
 constexpr double kAnimationTextFullLengthShownProgressState = 0.5;
 }  // namespace
@@ -92,22 +88,6 @@
   return visibility_changed;
 }
 
-double SharingIconView::WidthMultiplier() const {
-  double multiplier = PageActionIconView::WidthMultiplier();
-
-  double min_width = image()->GetPreferredSize().width() + GetInsets().width();
-  double spacing = ui::MaterialDesignController::touch_ui()
-                       ? kIconTextSpacingTouch
-                       : kIconTextSpacing;
-  double label_width = label()->GetPreferredSize().width();
-  double max_width = min_width + spacing + label_width;
-
-  // We offset the width multiplier to start expanding the label straight away
-  // instead of completely hide the icon and expanding it from zero width.
-  double offset = min_width / max_width;
-  return multiplier * (1 - offset) + offset;
-}
-
 void SharingIconView::AnimationProgressed(const gfx::Animation* animation) {
   if (animation->is_animating() &&
       GetAnimationValue() >= kAnimationTextFullLengthShownProgressState &&
diff --git a/chrome/browser/ui/views/sharing/sharing_icon_view.h b/chrome/browser/ui/views/sharing/sharing_icon_view.h
index 04b6011..e3a72ef 100644
--- a/chrome/browser/ui/views/sharing/sharing_icon_view.h
+++ b/chrome/browser/ui/views/sharing/sharing_icon_view.h
@@ -30,7 +30,6 @@
   // PageActionIconView:
   void OnExecuting(PageActionIconView::ExecuteSource execute_source) override;
   bool IsTriggerableEvent(const ui::Event& event) override;
-  double WidthMultiplier() const override;
   const gfx::VectorIcon& GetVectorIconBadge() const override;
   views::BubbleDialogDelegateView* GetBubble() const override;
   bool Update() override;
diff --git a/chrome/browser/ui/views/status_bubble_views.cc b/chrome/browser/ui/views/status_bubble_views.cc
index 44e6dcf..b193359 100644
--- a/chrome/browser/ui/views/status_bubble_views.cc
+++ b/chrome/browser/ui/views/status_bubble_views.cc
@@ -39,6 +39,7 @@
 #include "ui/views/animation/animation_delegate_views.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/controls/scrollbar/scroll_bar_views.h"
+#include "ui/views/layout/fill_layout.h"
 #include "ui/views/style/typography.h"
 #include "ui/views/widget/root_view.h"
 #include "ui/views/widget/widget.h"
@@ -61,12 +62,8 @@
 // off-screen.
 constexpr int kMousePadding = 20;
 
-// The horizontal offset of the text within the status bubble, not including the
-// outer shadow ring.
-constexpr int kTextPositionX = 5;
-
-// The minimum horizontal space between the (right) end of the text and the edge
-// of the status bubble, not including the outer shadow ring.
+// The minimum horizontal space between the edges of the text and the edges of
+// the status bubble, not including the outer shadow ring.
 constexpr int kTextHorizPadding = 5;
 
 // Delays before we start hiding or showing the bubble after we receive a
@@ -148,12 +145,11 @@
     STYLE_STANDARD_RIGHT
   };
 
-  StatusView(StatusBubbleViews* status_bubble, gfx::Size popup_size);
+  explicit StatusView(StatusBubbleViews* status_bubble);
   ~StatusView() override;
 
   // views::View:
-  void Layout() override;
-  void OnThemeChanged() override;
+  gfx::Insets GetInsets() const override;
 
   // Set the bubble text, or hide the bubble if |text| is an empty string.
   // Triggers an animation sequence to display if |should_animate_open| is true.
@@ -178,13 +174,13 @@
   // Depending on the state of the bubble this will hide the popup or not.
   void OnAnimationEnded();
 
-  void SetWidth(int new_width);
-
   gfx::Animation* animation() { return animation_.get(); }
 
-  bool IsDestroyPopupTimerRunning() const {
-    return destroy_popup_timer_.IsRunning();
-  }
+  bool IsDestroyPopupTimerRunning() const;
+
+ protected:
+  // views::View:
+  void OnThemeChanged() override;
 
  private:
   class InitialTimer;
@@ -218,8 +214,6 @@
   // The currently-displayed text.
   views::Label* text_;
 
-  gfx::Size popup_size_;
-
   // A timer used to delay destruction of the popup widget. This is meant to
   // balance the performance tradeoffs of rapid creation/destruction and the
   // memory savings of closing the widget when it's hidden and unused.
@@ -230,11 +224,12 @@
   DISALLOW_COPY_AND_ASSIGN(StatusView);
 };
 
-StatusBubbleViews::StatusView::StatusView(StatusBubbleViews* status_bubble,
-                                          gfx::Size popup_size)
-    : status_bubble_(status_bubble), popup_size_(popup_size) {
+StatusBubbleViews::StatusView::StatusView(StatusBubbleViews* status_bubble)
+    : status_bubble_(status_bubble) {
   animation_ = std::make_unique<StatusViewAnimation>(this, 0, 0);
 
+  SetLayoutManager(std::make_unique<views::FillLayout>());
+
   std::unique_ptr<views::Label> text = std::make_unique<views::Label>();
   // Don't move this after AddChildView() since this function would trigger
   // repaint which should not happen in the constructor.
@@ -248,18 +243,8 @@
   CancelTimer();
 }
 
-void StatusBubbleViews::StatusView::Layout() {
-  gfx::Rect text_rect(kTextPositionX, 0,
-                      popup_size_.width() - kTextHorizPadding - kTextPositionX,
-                      popup_size_.height());
-  text_rect.Inset(kShadowThickness, kShadowThickness);
-  // Make sure the text is aligned to the right on RTL UIs.
-  text_rect = GetMirroredRect(text_rect);
-  text_->SetBoundsRect(text_rect);
-}
-
-void StatusBubbleViews::StatusView::OnThemeChanged() {
-  SetTextLabelColors(text_);
+gfx::Insets StatusBubbleViews::StatusView::GetInsets() const {
+  return gfx::Insets(kShadowThickness, kShadowThickness + kTextHorizPadding);
 }
 
 void StatusBubbleViews::StatusView::SetText(const base::string16& text,
@@ -273,6 +258,13 @@
   }
 }
 
+void StatusBubbleViews::StatusView::SetStyle(BubbleStyle style) {
+  if (style_ != style) {
+    style_ = style;
+    SchedulePaint();
+  }
+}
+
 void StatusBubbleViews::StatusView::ShowInstantly() {
   animation_->Stop();
   CancelTimer();
@@ -300,6 +292,33 @@
                              &StatusBubbleViews::DestroyPopup);
 }
 
+void StatusBubbleViews::StatusView::ResetTimer() {
+  if (state_ == BUBBLE_SHOWING_TIMER) {
+    // We hadn't yet begun showing anything when we received a new request
+    // for something to show, so we start from scratch.
+    RestartTimer(kShowDelay);
+  }
+}
+
+void StatusBubbleViews::StatusView::SetOpacity(float opacity) {
+  GetWidget()->SetOpacity(opacity);
+}
+
+void StatusBubbleViews::StatusView::OnAnimationEnded() {
+  if (state_ == BUBBLE_SHOWING_FADE)
+    state_ = BUBBLE_SHOWN;
+  else if (state_ == BUBBLE_HIDING_FADE)
+    HideInstantly();  // This view may be destroyed after calling HideInstantly.
+}
+
+bool StatusBubbleViews::StatusView::IsDestroyPopupTimerRunning() const {
+  return destroy_popup_timer_.IsRunning();
+}
+
+void StatusBubbleViews::StatusView::OnThemeChanged() {
+  SetTextLabelColors(text_);
+}
+
 void StatusBubbleViews::StatusView::StartTimer(base::TimeDelta time) {
   if (timer_factory_.HasWeakPtrs())
     timer_factory_.InvalidateWeakPtrs();
@@ -331,14 +350,6 @@
   StartTimer(delay);
 }
 
-void StatusBubbleViews::StatusView::ResetTimer() {
-  if (state_ == BUBBLE_SHOWING_TIMER) {
-    // We hadn't yet begun showing anything when we received a new request
-    // for something to show, so we start from scratch.
-    RestartTimer(kShowDelay);
-  }
-}
-
 void StatusBubbleViews::StatusView::StartFade(float start,
                                               float end,
                                               base::TimeDelta duration) {
@@ -391,29 +402,6 @@
   }
 }
 
-void StatusBubbleViews::StatusView::SetOpacity(float opacity) {
-  GetWidget()->SetOpacity(opacity);
-}
-
-void StatusBubbleViews::StatusView::SetStyle(BubbleStyle style) {
-  if (style_ != style) {
-    style_ = style;
-    SchedulePaint();
-  }
-}
-
-void StatusBubbleViews::StatusView::OnAnimationEnded() {
-  if (state_ == BUBBLE_SHOWING_FADE)
-    state_ = BUBBLE_SHOWN;
-  else if (state_ == BUBBLE_HIDING_FADE)
-    HideInstantly();  // This view may be destroyed after calling HideInstantly.
-}
-
-void StatusBubbleViews::StatusView::SetWidth(int new_width) {
-  popup_size_.set_width(new_width);
-  Layout();
-}
-
 void StatusBubbleViews::StatusView::SetTextLabelColors(views::Label* text) {
   const auto* theme_provider = status_bubble_->base_view()->GetThemeProvider();
   SkColor bubble_color =
@@ -467,8 +455,7 @@
   }
 
   // Snap to pixels to avoid shadow blurriness.
-  const int width = std::round(popup_size_.width() * scale);
-  const int height = std::round(popup_size_.height() * scale);
+  gfx::Size scaled_size = gfx::ScaleToRoundedSize(size(), scale);
 
   // This needs to be pixel-aligned too. Floor is perferred here because a more
   // conservative value prevents the bottom edge from occasionally leaving a gap
@@ -484,10 +471,11 @@
     std::swap(clip_left, clip_right);
 
   const int clip_bottom = clip_left || clip_right ? shadow_thickness_pixels : 0;
-  gfx::Rect clip_rect(clip_left, 0, width - clip_right, height - clip_bottom);
+  gfx::Rect clip_rect(scaled_size);
+  clip_rect.Inset(clip_left, 0, clip_right, clip_bottom);
   canvas->ClipRect(clip_rect);
 
-  gfx::RectF bubble_rect(width, height);
+  gfx::RectF bubble_rect{gfx::SizeF(scaled_size)};
   // Reposition() moves the bubble down and to the left in order to overlap the
   // client edge (or window frame when there's no client edge) by 1 DIP. We want
   // a 1 pixel shadow on the innermost pixel of that overlap. So we inset the
@@ -660,7 +648,7 @@
     DCHECK(!view_);
     DCHECK(!expand_view_);
     popup_ = std::make_unique<views::Widget>();
-    view_ = new StatusView(this, size_);
+    view_ = new StatusView(this);
     expand_view_ = std::make_unique<StatusViewExpander>(this, view_);
 
     views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP);
@@ -721,8 +709,6 @@
     // TODO(flackr): Get the non-transformed point so that the status bubble
     // popup window's position is consistent with the base_view_'s window.
     views::View::ConvertPointToScreen(base_view_, &top_left);
-
-    view_->SetWidth(size_.width());
     popup_->SetBounds(gfx::Rect(top_left.x() + position_.x(),
                                 top_left.y() + position_.y(),
                                 size_.width(), size_.height()));
@@ -746,8 +732,7 @@
   // Get the width of the elided url
   int elided_url_width = gfx::GetStringWidth(url_string, GetFont());
   // Add proper paddings
-  return elided_url_width + (kShadowThickness * 2) + kTextPositionX +
-         kTextHorizPadding + 1;
+  return elided_url_width + (kShadowThickness + kTextHorizPadding) * 2 + 1;
 }
 
 void StatusBubbleViews::OnThemeChanged() {
@@ -797,8 +782,8 @@
   }
 
   // Set Elided Text corresponding to the GURL object.
-  int text_width = static_cast<int>(size_.width() - (kShadowThickness * 2) -
-                                    kTextPositionX - kTextHorizPadding - 1);
+  int text_width = static_cast<int>(
+      size_.width() - (kShadowThickness + kTextHorizPadding) * 2 - 1);
   url_text_ = url_formatter::ElideUrl(url, GetFont(), text_width);
 
   // An URL is always treated as a left-to-right string. On right-to-left UIs
@@ -1003,8 +988,8 @@
 int StatusBubbleViews::GetMaxStatusBubbleWidth() {
   const ui::NativeTheme* theme = base_view_->GetNativeTheme();
   return static_cast<int>(
-      std::max(0, base_view_->bounds().width() - (kShadowThickness * 2) -
-                      kTextPositionX - kTextHorizPadding - 1 -
+      std::max(0, base_view_->bounds().width() -
+                      (kShadowThickness + kTextHorizPadding) * 2 - 1 -
                       views::ScrollBarViews::GetVerticalScrollBarWidth(theme)));
 }
 
diff --git a/chrome/browser/ui/views/tabs/tab_group_underline.cc b/chrome/browser/ui/views/tabs/tab_group_underline.cc
index c120b43..f8abbcde 100644
--- a/chrome/browser/ui/views/tabs/tab_group_underline.cc
+++ b/chrome/browser/ui/views/tabs/tab_group_underline.cc
@@ -17,6 +17,8 @@
 #include "ui/views/background.h"
 #include "ui/views/view.h"
 
+constexpr int TabGroupUnderline::kStrokeThickness;
+
 TabGroupUnderline::TabGroupUnderline(TabStrip* tab_strip, TabGroupId group)
     : tab_strip_(tab_strip), group_(group) {
   UpdateVisuals();
@@ -30,24 +32,24 @@
 void TabGroupUnderline::UpdateVisuals() {
   SkColor color = GetColor();
 
-  int start_x = GetStart();
-  int end_x = GetEnd();
+  const int start_x = GetStart();
+  const int end_x = GetEnd();
 
-  int start_y = tab_strip_->bounds().height() - 1;
-  constexpr int kStrokeWidth = 2;
+  const int start_y = tab_strip_->bounds().height() - 1;
 
-  SetBounds(start_x, start_y - kStrokeWidth, end_x - start_x, kStrokeWidth);
+  SetBounds(start_x, start_y - kStrokeThickness, end_x - start_x,
+            kStrokeThickness);
   SetBackground(views::CreateSolidBackground(color));
 }
 
-SkColor TabGroupUnderline::GetColor() {
+SkColor TabGroupUnderline::GetColor() const {
   const TabGroupVisualData* data =
       tab_strip_->controller()->GetVisualDataForGroup(group_);
 
   return data->color();
 }
 
-int TabGroupUnderline::GetStart() {
+int TabGroupUnderline::GetStart() const {
   const gfx::Rect group_header_bounds =
       tab_strip_->group_header(group_)->bounds();
 
@@ -55,7 +57,7 @@
   return group_header_bounds.x() + kInset;
 }
 
-int TabGroupUnderline::GetEnd() {
+int TabGroupUnderline::GetEnd() const {
   const std::vector<int> tabs_in_group =
       tab_strip_->controller()->ListTabsInGroup(group_);
   const int last_tab_index = tabs_in_group[tabs_in_group.size() - 1];
diff --git a/chrome/browser/ui/views/tabs/tab_group_underline.h b/chrome/browser/ui/views/tabs/tab_group_underline.h
index 917993a2..ca7de03 100644
--- a/chrome/browser/ui/views/tabs/tab_group_underline.h
+++ b/chrome/browser/ui/views/tabs/tab_group_underline.h
@@ -6,15 +6,17 @@
 #define CHROME_BROWSER_UI_VIEWS_TABS_TAB_GROUP_UNDERLINE_H_
 
 #include "chrome/browser/ui/tabs/tab_group_id.h"
-#include "chrome/browser/ui/views/tabs/tab_strip.h"
-#include "chrome/browser/ui/views/tabs/tab_strip_controller.h"
 #include "ui/views/view.h"
 
+class TabStrip;
+
 // View for tab group underlines in the tab strip, which are markers of group
 // members. There is one underline for each group, which is included in the tab
 // strip flow and positioned across all tabs in the group.
 class TabGroupUnderline : public views::View {
  public:
+  static constexpr int kStrokeThickness = 2;
+
   TabGroupUnderline(TabStrip* tab_strip, TabGroupId group);
 
   TabGroupId group() const { return group_; }
@@ -26,18 +28,18 @@
   void OnPaint(gfx::Canvas* canvas) override;
 
  private:
-  TabStrip* const tab_strip_;
-  const TabGroupId group_;
-
   // The underline color is the group color.
-  SkColor GetColor();
+  SkColor GetColor() const;
 
   // The underline starts at the left edge of the header chip.
-  int GetStart();
+  int GetStart() const;
 
   // The underline ends at the right edge of the last grouped tab's close
   // button.
-  int GetEnd();
+  int GetEnd() const;
+
+  TabStrip* const tab_strip_;
+  const TabGroupId group_;
 
   DISALLOW_COPY_AND_ASSIGN(TabGroupUnderline);
 };
diff --git a/chrome/browser/ui/views/tabs/tab_strip.h b/chrome/browser/ui/views/tabs/tab_strip.h
index 9f8f7e7e..3ca2d959 100644
--- a/chrome/browser/ui/views/tabs/tab_strip.h
+++ b/chrome/browser/ui/views/tabs/tab_strip.h
@@ -25,6 +25,7 @@
 #include "chrome/browser/ui/views/tabs/tab_animation_state.h"
 #include "chrome/browser/ui/views/tabs/tab_controller.h"
 #include "chrome/browser/ui/views/tabs/tab_drag_context.h"
+#include "chrome/browser/ui/views/tabs/tab_group_header.h"
 #include "chrome/browser/ui/views/tabs/tab_strip.h"
 #include "ui/base/material_design/material_design_controller.h"
 #include "ui/base/material_design/material_design_controller_observer.h"
@@ -43,7 +44,6 @@
 class NewTabButton;
 class StackedTabStripLayout;
 class Tab;
-class TabGroupHeader;
 class TabGroupUnderline;
 class TabGroupId;
 class TabHoverCardBubbleView;
@@ -200,7 +200,9 @@
   Tab* tab_at(int index) const { return tabs_.view_at(index); }
 
   // Returns the TabGroupHeader with ID |id|.
-  TabGroupHeader* group_header(TabGroupId id) { return GetGroupHeaders()[id]; }
+  TabGroupHeader* group_header(TabGroupId id) {
+    return group_headers_[id].get();
+  }
 
   // Returns the NewTabButton.
   NewTabButton* new_tab_button() { return new_tab_button_; }
diff --git a/chrome/browser/ui/views/tabs/tab_strip_unittest.cc b/chrome/browser/ui/views/tabs/tab_strip_unittest.cc
index c3537bc7..f5c6f28 100644
--- a/chrome/browser/ui/views/tabs/tab_strip_unittest.cc
+++ b/chrome/browser/ui/views/tabs/tab_strip_unittest.cc
@@ -1166,7 +1166,7 @@
   EXPECT_EQ(first_slot_x, headers[0]->x());
 }
 
-TEST_P(TabStripTest, DeleteTabGroupHeaderWhenEmpty) {
+TEST_P(TabStripTest, DeleteTabGroupHeaderAndUnderlineWhenEmpty) {
   tab_strip_->AddTabAt(0, TabRendererData(), false);
   tab_strip_->AddTabAt(1, TabRendererData(), false);
   base::Optional<TabGroupId> group = TabGroupId::GenerateNew();
@@ -1175,8 +1175,10 @@
   controller_->MoveTabIntoGroup(0, base::nullopt);
 
   EXPECT_EQ(1u, ListGroupHeaders().size());
+  EXPECT_EQ(1u, ListGroupUnderlines().size());
   controller_->MoveTabIntoGroup(1, base::nullopt);
   EXPECT_EQ(0u, ListGroupHeaders().size());
+  EXPECT_EQ(0u, ListGroupUnderlines().size());
 }
 
 TEST_P(TabStripTest, GroupUnderlineBasics) {
@@ -1195,25 +1197,11 @@
   // Update underline manually in the absence of a real Paint cycle.
   underline->UpdateVisuals();
   constexpr int kInset = 20;
-  constexpr int kStrokeWidth = 2;
   EXPECT_EQ(underline->x(), kInset);
   EXPECT_GT(underline->width(), 0);
   EXPECT_EQ(underline->bounds().right(),
             tab_strip_->tab_at(0)->bounds().right() - kInset);
-  EXPECT_EQ(underline->height(), kStrokeWidth);
-}
-
-TEST_P(TabStripTest, DeleteTabGroupUnderlineWhenEmpty) {
-  tab_strip_->AddTabAt(0, TabRendererData(), false);
-  tab_strip_->AddTabAt(1, TabRendererData(), false);
-  base::Optional<TabGroupId> group = TabGroupId::GenerateNew();
-  controller_->MoveTabIntoGroup(0, group);
-  controller_->MoveTabIntoGroup(1, group);
-  controller_->MoveTabIntoGroup(0, base::nullopt);
-
-  EXPECT_EQ(1u, ListGroupUnderlines().size());
-  controller_->MoveTabIntoGroup(1, base::nullopt);
-  EXPECT_EQ(0u, ListGroupUnderlines().size());
+  EXPECT_EQ(underline->height(), TabGroupUnderline::kStrokeThickness);
 }
 
 TEST_P(TabStripTest, ChangingLayoutTypeResizesTabs) {
diff --git a/chrome/browser/ui/views/tabs/tab_style_views.cc b/chrome/browser/ui/views/tabs/tab_style_views.cc
index a12d9d7..55b17d6 100644
--- a/chrome/browser/ui/views/tabs/tab_style_views.cc
+++ b/chrome/browser/ui/views/tabs/tab_style_views.cc
@@ -18,6 +18,7 @@
 #include "chrome/browser/ui/views/tabs/tab.h"
 #include "chrome/browser/ui/views/tabs/tab_close_button.h"
 #include "chrome/browser/ui/views/tabs/tab_controller.h"
+#include "chrome/browser/ui/views/tabs/tab_group_underline.h"
 #include "chrome/grit/theme_resources.h"
 #include "third_party/skia/include/core/SkScalar.h"
 #include "third_party/skia/include/pathops/SkPathOps.h"
@@ -655,7 +656,7 @@
 int GM2TabStyle::GetStrokeThickness(bool should_paint_as_active) const {
   base::Optional<SkColor> group_color = tab_->GetGroupColor();
   if (group_color.has_value() && tab_->IsActive())
-    return 2;
+    return TabGroupUnderline::kStrokeThickness;
 
   if (tab_->IsActive() || should_paint_as_active)
     return tab_->controller()->GetStrokeThickness();
diff --git a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc
index 1098869..b4daf5db 100644
--- a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc
@@ -11,6 +11,7 @@
 #include "base/bind.h"
 #include "base/macros.h"
 #include "base/strings/string_number_conversions.h"
+#include "build/buildflag.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/ash/ash_util.h"
@@ -18,6 +19,7 @@
 #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/browser_resources.h"
+#include "chromeos/assistant/buildflags.h"
 #include "chromeos/services/assistant/public/cpp/assistant_prefs.h"
 #include "components/prefs/pref_service.h"
 #include "components/session_manager/core/session_manager.h"
@@ -122,10 +124,16 @@
 void AssistantOptInDialog::Show(
     ash::FlowType type,
     ash::AssistantSetup::StartAssistantOptInFlowCallback callback) {
+#if !BUILDFLAG(ENABLE_CROS_LIBASSISTANT)
+  std::move(callback).Run(false);
+  return;
+#endif
+
   // Check session state here to prevent timing issue -- session state might
   // have changed during the mojom calls to launch the opt-in dalog.
   if (session_manager::SessionManager::Get()->session_state() !=
       session_manager::SessionState::ACTIVE) {
+    std::move(callback).Run(false);
     return;
   }
   if (g_dialog) {
diff --git a/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc
index e15b21036..bb367ef3d 100644
--- a/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc
@@ -80,6 +80,10 @@
   CallJS("login.ErrorMessageScreen.showConnectingIndicator", value);
 }
 
+void ErrorScreenHandler::SetIsPersistentError(bool is_persistent) {
+  CallJS("login.ErrorMessageScreen.setIsPersistentError", is_persistent);
+}
+
 void ErrorScreenHandler::SetUIState(NetworkError::UIState ui_state) {
   CallJS("login.ErrorMessageScreen.setUIState", static_cast<int>(ui_state));
 }
diff --git a/chrome/browser/ui/webui/chromeos/login/error_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/error_screen_handler.h
index 67a2695..acc425a 100644
--- a/chrome/browser/ui/webui/chromeos/login/error_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/error_screen_handler.h
@@ -51,6 +51,9 @@
   // Updates visibility of the label indicating we're reconnecting.
   virtual void SetShowConnectingIndicator(bool value) = 0;
 
+  // Makes error persistent (e.g. non-closable).
+  virtual void SetIsPersistentError(bool is_persistent) = 0;
+
   // Sets current UI state of the screen.
   virtual void SetUIState(NetworkError::UIState ui_state) = 0;
 };
@@ -75,6 +78,7 @@
   void SetGuestSigninAllowed(bool value) override;
   void SetOfflineSigninAllowed(bool value) override;
   void SetShowConnectingIndicator(bool value) override;
+  void SetIsPersistentError(bool is_persistent) override;
   void SetUIState(NetworkError::UIState ui_state) override;
 
   // WebUIMessageHandler:
diff --git a/chrome/browser/web_applications/system_web_app_manager.cc b/chrome/browser/web_applications/system_web_app_manager.cc
index 39a6025..d6e7208a 100644
--- a/chrome/browser/web_applications/system_web_app_manager.cc
+++ b/chrome/browser/web_applications/system_web_app_manager.cc
@@ -64,7 +64,7 @@
         app_list::kInternalAppIdSettings};
   }
   // Large enough to see the heading text "Settings" in the top-left.
-  infos[SystemAppType::SETTINGS].minimum_window_size = {200, 100};
+  infos[SystemAppType::SETTINGS].minimum_window_size = {300, 100};
 
   if (SystemWebAppManager::IsAppEnabled(SystemAppType::TERMINAL)) {
     constexpr char kChromeTerminalPWAURL[] = "chrome://terminal/html/pwa.html";
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn
index 594a13bd..e7e941d 100644
--- a/chrome/common/BUILD.gn
+++ b/chrome/common/BUILD.gn
@@ -760,6 +760,7 @@
     "//mojo/public/mojom/base",
     "//third_party/blink/public/mojom:mojom_platform",
     "//ui/gfx/geometry/mojom",
+    "//ui/gfx/image/mojom",
     "//url/mojom:url_mojom_gurl",
     "//url/mojom:url_mojom_origin",
   ]
diff --git a/chrome/common/extensions/api/PRESUBMIT.py b/chrome/common/extensions/api/PRESUBMIT.py
index 0b33c830..af5b169 100644
--- a/chrome/common/extensions/api/PRESUBMIT.py
+++ b/chrome/common/extensions/api/PRESUBMIT.py
@@ -35,6 +35,7 @@
     'file_system_provider.idl': 'file_system_provider.js',
     'language_settings_private.idl': 'language_settings_private.js',
     'passwords_private.idl': 'passwords_private.js',
+    'resources_private.idl': 'resources_private.js',
     'safe_browsing_private.idl': 'safe_browsing_private.js',
     'system_private.json': 'system_private.js',
     'users_private.idl': 'users_private.js',
diff --git a/chrome/common/mac/app_shim.mojom b/chrome/common/mac/app_shim.mojom
index b2f13df9..6ae2987 100644
--- a/chrome/common/mac/app_shim.mojom
+++ b/chrome/common/mac/app_shim.mojom
@@ -6,6 +6,8 @@
 
 import "components/remote_cocoa/common/application.mojom";
 import "mojo/public/mojom/base/file_path.mojom";
+import "mojo/public/mojom/base/string16.mojom";
+import "ui/gfx/image/mojom/image.mojom";
 import "url/mojom/url.mojom";
 
 [Native]
@@ -20,6 +22,24 @@
 [Native]
 enum AppShimAttentionType;
 
+// An entry in the profiles NSMenu.
+struct ProfileMenuItem {
+  // The name to display.
+  mojo_base.mojom.String16 name;
+
+  // The icon to display next to the name.
+  gfx.mojom.ImageSkia? icon;
+
+  // The index used to look up this item when selected.
+  uint32 menu_index;
+
+  // Whether or not this menu item is listed as selected.
+  bool active;
+
+  // The profile path to associate with this item.
+  mojo_base.mojom.FilePath profile_path;
+};
+
 // Interface through which the browser communicates to a shim process.
 interface AppShim {
   // Create the interface to the NSApplication (through which NSViews and
@@ -37,6 +57,9 @@
 
   // Instructs the shim to set its badge label.
   SetBadgeLabel(string badge_label);
+
+  // Called to update the state of the profiles NSMenu.
+  UpdateProfileMenu(array<ProfileMenuItem> profile_menu_items);
 };
 
 // Interface through which the a process communicates to the browser process.
@@ -47,6 +70,9 @@
   // if the focus type indicates a reopen and there are no open windows.
   FocusApp(AppShimFocusType focus_type,
            array<mojo_base.mojom.FilePath> files);
+
+  // Called when a profile is selected from the profiles menu.
+  ProfileSelectedFromMenu(mojo_base.mojom.FilePath profile_path);
 };
 
 // Properties of an app shim that are specified when it connects to the browser
diff --git a/chrome/common/media/OWNERS b/chrome/common/media/OWNERS
index 36ba8f37..64f68d00 100644
--- a/chrome/common/media/OWNERS
+++ b/chrome/common/media/OWNERS
@@ -1,3 +1,5 @@
+file://media/OWNERS
+
 per-file *_messages*.h=set noparent
 per-file *_messages*.h=file://ipc/SECURITY_OWNERS
 
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 8964c0e..f97368b 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1044,6 +1044,7 @@
       "../browser/policy/policy_test_utils.cc",
       "../browser/policy/policy_test_utils.h",
       "../browser/policy/site_isolation_policy_browsertest.cc",
+      "../browser/portal/portal_browsertest.cc",
       "../browser/predictors/loading_predictor_browsertest.cc",
       "../browser/prefetch/prefetch_browsertest.cc",
       "../browser/prefs/pref_functional_browsertest.cc",
@@ -5134,7 +5135,6 @@
       "../browser/ui/app_list/search/arc/arc_playstore_search_provider_unittest.cc",
       "../browser/ui/app_list/search/common/file_icon_util_unittest.cc",
       "../browser/ui/app_list/search/launcher_search/launcher_search_icon_image_loader_unittest.cc",
-      "../browser/ui/app_list/search/logging/search_ranking_event_logger_unittest.cc",
       "../browser/ui/app_list/search/search_result_ranker/app_launch_event_logger_unittest.cc",
       "../browser/ui/app_list/search/search_result_ranker/app_launch_predictor_unittest.cc",
       "../browser/ui/app_list/search/search_result_ranker/app_list_launch_metrics_provider_unittest.cc",
@@ -5146,6 +5146,7 @@
       "../browser/ui/app_list/search/search_result_ranker/recurrence_predictor_unittest.cc",
       "../browser/ui/app_list/search/search_result_ranker/recurrence_ranker_unittest.cc",
       "../browser/ui/app_list/search/search_result_ranker/recurrence_ranker_util_unittest.cc",
+      "../browser/ui/app_list/search/search_result_ranker/search_ranking_event_logger_unittest.cc",
       "../browser/ui/app_list/search/search_result_ranker/search_result_ranker_unittest.cc",
       "../browser/ui/app_list/search/search_utils/fuzzy_tokenized_string_match_unittest.cc",
       "../browser/ui/app_list/search/search_utils/sequence_matcher_unittest.cc",
diff --git a/chrome/test/base/testing_profile.cc b/chrome/test/base/testing_profile.cc
index 6f2e236a..7afa1ca 100644
--- a/chrome/test/base/testing_profile.cc
+++ b/chrome/test/base/testing_profile.cc
@@ -746,6 +746,10 @@
   return incognito_profile_.get();
 }
 
+void TestingProfile::DestroyOffTheRecordProfile() {
+  incognito_profile_.reset();
+}
+
 bool TestingProfile::HasOffTheRecordProfile() {
   return incognito_profile_.get() != nullptr;
 }
diff --git a/chrome/test/base/testing_profile.h b/chrome/test/base/testing_profile.h
index 42546b0..d92722a 100644
--- a/chrome/test/base/testing_profile.h
+++ b/chrome/test/base/testing_profile.h
@@ -304,7 +304,7 @@
   ProfileType GetProfileType() const override;
 
   Profile* GetOffTheRecordProfile() override;
-  void DestroyOffTheRecordProfile() override {}
+  void DestroyOffTheRecordProfile() override;
   bool HasOffTheRecordProfile() override;
   Profile* GetOriginalProfile() override;
   const Profile* GetOriginalProfile() const override;
diff --git a/chrome/test/chromedriver/chrome/chrome_impl.cc b/chrome/test/chromedriver/chrome/chrome_impl.cc
index 9e207f2..5529a47f 100644
--- a/chrome/test/chromedriver/chrome/chrome_impl.cc
+++ b/chrome/test/chromedriver/chrome/chrome_impl.cc
@@ -429,14 +429,8 @@
 
   base::DictionaryValue params;
   params.SetBoolean("ignore", true);
-  // We ignore the status returned by this command - If it is an error, the
-  // target likely doesn't yet support the command. In that case, we'll fall
-  // back to --ignore-certificate-errors.
-  // TODO(eseckler): Handle status once we remove support for
-  // --ignore-certificate-errors.
-  devtools_websocket_client_->SendCommand("Security.setIgnoreCertificateErrors",
-                                          params);
-  return Status(kOk);
+  return devtools_websocket_client_->SendCommand(
+      "Security.setIgnoreCertificateErrors", params);
 }
 
 Status ChromeImpl::SetPermission(
diff --git a/chrome/test/chromedriver/chrome_launcher.cc b/chrome/test/chromedriver/chrome_launcher.cc
index 6434dbe..da0b934 100644
--- a/chrome/test/chromedriver/chrome_launcher.cc
+++ b/chrome/test/chromedriver/chrome_launcher.cc
@@ -69,10 +69,9 @@
 
 namespace {
 
-// TODO(eseckler): Remove --ignore-certificate-errors for newer Chrome versions
-// that support the Security DevTools domain on the browser target.
 const char* const kCommonSwitches[] = {
-    "disable-popup-blocking", "enable-automation", "ignore-certificate-errors",
+    "disable-popup-blocking",
+    "enable-automation",
 };
 
 const char* const kDesktopSwitches[] = {
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py
index cb7587f7..86630f40 100755
--- a/chrome/test/chromedriver/test/run_py_tests.py
+++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -2379,6 +2379,7 @@
 
   def setUp(self):
     self._driver = self.CreateDriver(
+        accept_insecure_certs=True,
         chrome_switches=['host-resolver-rules=MAP * 127.0.0.1'])
 
   def testAddVirtualAuthenticator(self):
diff --git a/chrome/test/data/portal/activate-portal.html b/chrome/test/data/portal/activate-portal.html
new file mode 100644
index 0000000..9bdead7
--- /dev/null
+++ b/chrome/test/data/portal/activate-portal.html
@@ -0,0 +1,6 @@
+<!DOCTYPE html>
+<script>
+  window.onportalactivate = e => {
+    document.body.appendChild(e.adoptPredecessor());
+  };
+</script>
diff --git a/chrome/test/data/portal/activate.html b/chrome/test/data/portal/activate.html
new file mode 100644
index 0000000..6c02f741
--- /dev/null
+++ b/chrome/test/data/portal/activate.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<body>
+  <portal src="activate-portal.html"></portal>
+  <script>
+    var loadPromise = new Promise(r => {
+      window.onload = r;
+    });
+
+    function activate() {
+      return document.querySelector("portal").activate();
+    }
+  </script>
+</body>
diff --git a/chrome/test/data/webui/chromeos/fake_network_config_mojom.js b/chrome/test/data/webui/chromeos/fake_network_config_mojom.js
index 270f758a..1557683 100644
--- a/chrome/test/data/webui/chromeos/fake_network_config_mojom.js
+++ b/chrome/test/data/webui/chromeos/fake_network_config_mojom.js
@@ -28,6 +28,12 @@
     /** @type {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} */
     this.globalPolicy_ = undefined;
 
+    /** @type {!Array<!chromeos.networkConfig.mojom.NetworkCertificate>} */
+    this.serverCas_ = [];
+
+    /** @type {!Array<!chromeos.networkConfig.mojom.NetworkCertificate>} */
+    this.userCerts_ = [];
+
     /**
      * @type {!Array<!chromeos.networkConfig.mojom.CrosNetworkConfigObserver>
      */
@@ -181,6 +187,16 @@
     this.onVpnProvidersChanged();
   }
 
+  /**
+   * @param {!Array<!chromeos.networkConfig.mojom.NetworkCertificate>} serverCas
+   * @param {!Array<!chromeos.networkConfig.mojom.NetworkCertificate>} userCerts
+   */
+  setCertificatesForTest(serverCas, userCerts) {
+    this.serverCas_ = serverCas;
+    this.userCerts_ = userCerts;
+    this.onNetworkCertificatesChanged();
+  }
+
   // networkConfig observers
 
   onActiveNetworksChanged() {
@@ -210,6 +226,10 @@
     this.observers_.forEach(o => o.onVpnProvidersChanged());
   }
 
+  onNetworkCertificatesChanged() {
+    this.observers_.forEach(o => o.onNetworkCertificatesChanged());
+  }
+
   // networkConfig methods
 
   /**
@@ -348,7 +368,7 @@
   getNetworkCertificates() {
     return new Promise(resolve => {
       this.methodCalled('getNetworkCertificates');
-      resolve({serverCas: [], userCerts: []});
+      resolve({serverCas: this.serverCas_, userCerts: this.userCerts_});
     });
   }
 }
diff --git a/chrome/test/data/webui/chromeos/fake_networking_private.js b/chrome/test/data/webui/chromeos/fake_networking_private.js
deleted file mode 100644
index a238cff..0000000
--- a/chrome/test/data/webui/chromeos/fake_networking_private.js
+++ /dev/null
@@ -1,262 +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.
-
-/**
- * @fileoverview Fake implementation of chrome.networkingPrivate for testing.
- *    NOTE: Include "'//ui/webui/resources/js/promise_resolver.js'"
- *    in any test that uses this.
- */
-cr.define('chrome', function() {
-  /**
-   * @constructor
-   * @implements {NetworkingPrivate}
-   */
-  function FakeNetworkingPrivate() {
-    /** @type {!Object<chrome.networkingPrivate.DeviceStateProperties>} */
-    this.deviceStates_ = {};
-
-    /** @type {!Array<!chrome.networkingPrivate.NetworkStateProperties>} */
-    this.networkStates_ = [];
-
-    /** @type {!{chrome.networkingPrivate.GlobalPolicy}|undefined} */
-    this.globalPolicy_ = undefined;
-
-    /** @type {!{chrome.networkingPrivate.CertificateLists}|undefined} */
-    this.certificateLists_ = undefined;
-
-    /** @private {!Map<string, !PromiseResolver>} */
-    this.resolverMap_ = new Map();
-    this.resetForTest();
-  }
-
-  FakeNetworkingPrivate.prototype = {
-    resetForTest() {
-      this.deviceStates_ = {
-        Ethernet: {Type: 'Ethernet', State: 'Enabled'},
-        WiFi: {Type: 'WiFi', State: ''},
-        Cellular: {Type: 'Cellular', State: ''},
-        Tether: {Type: 'Tether', State: ''},
-        VPN: {Type: 'VPN', State: ''},
-      };
-
-      this.networkStates_ = [
-        {GUID: 'eth0_guid', Type: 'Ethernet'},
-      ];
-
-      this.globalPolicy_ = {};
-      this.certificateLists_ = {
-        serverCaCertificates: [],
-        userCertificates: [],
-      };
-
-      var methodNames = [
-        'getProperties', 'getProperties', 'getManagedProperties', 'getNetworks',
-        'getDeviceStates', 'getState', 'enableNetworkType',
-        'disableNetworkType', 'requestNetworkScan', 'getGlobalPolicy',
-        'getCertificateLists'
-      ];
-      methodNames.forEach((methodName) => {
-        this.resolverMap_.set(methodName, new PromiseResolver());
-      });
-    },
-
-    /**
-     * @param {!Array<!chrome.networkingPrivate.NetworkStateProperties>}
-     *     network
-     */
-    addNetworksForTest: function(networks) {
-      this.networkStates_ = this.networkStates_.concat(networks);
-    },
-
-    /** @param {!{chrome.networkingPrivate.CertificateLists}} */
-    setCertificatesForTest: function(certificateLists) {
-      this.certificateLists_ = certificateLists;
-    },
-
-    /**
-     * @param {string} type
-     * @return {?chrome.networkingPrivate.DeviceStateProperties}
-     */
-    getDeviceStateForTest: function(type) {
-      return this.deviceStates_[type] || null;
-    },
-
-    /**
-     * @param {string} methodName
-     * @protected
-     */
-    methodCalled(methodName) {
-      this.getResolver_(methodName).resolve();
-    },
-
-    /**
-     * @param {string} methodName
-     * @return {!Promise}
-     */
-    whenCalled(methodName) {
-      return this.getResolver_(methodName).promise;
-    },
-
-    /**
-     * @param {string} methodName
-     * @private
-     */
-    getResolver_(methodName) {
-      let method = this.resolverMap_.get(methodName);
-      assert(!!method, `Method '${methodName}' not found.`);
-      return method;
-    },
-
-    /** NetworkingPrivate implementation */
-
-    /** @override */
-    getProperties: function(guid, callback) {
-      var result = this.networkStates_.find(function(state) {
-        return state.GUID == guid;
-      });
-      callback(result);
-      this.methodCalled('getProperties');
-    },
-
-    /** @override */
-    getManagedProperties: function(guid, callback) {
-      var result = this.networkStates_.find(function(state) {
-        return state.GUID == guid;
-      });
-      callback(CrOncTest.convertToManagedProperties(result));
-      this.methodCalled('getManagedProperties');
-    },
-
-    /** @override */
-    getState: function(guid, callback) {
-      var result = this.networkStates_.find(function(state) {
-        return state.GUID == guid;
-      });
-      callback(result);
-      this.methodCalled('getState');
-    },
-
-    /** @override */
-    setProperties: assertNotReached,
-
-    /** @override */
-    createNetwork: assertNotReached,
-
-    /** @override */
-    forgetNetwork: assertNotReached,
-
-    /** @override */
-    getNetworks: function(filter, callback) {
-      var type = filter.networkType;
-      if (type == chrome.networkingPrivate.NetworkType.ALL) {
-        callback(this.networkStates_.slice());
-      } else {
-        callback(this.networkStates_.filter(function(state) {
-          return state.Type == type;
-        }));
-      }
-      this.methodCalled('getNetworks');
-    },
-
-    /** @override */
-    getDeviceStates: function(callback) {
-      var devices = [];
-      Object.keys(this.deviceStates_).forEach(function(type) {
-        var state = this.deviceStates_[type];
-        if (state.State != '') {
-          devices.push(state);
-        }
-      }.bind(this));
-      callback(devices);
-      this.methodCalled('getDeviceStates');
-    },
-
-    /** @override */
-    enableNetworkType: function(type) {
-      this.deviceStates_[type].State = 'Enabled';
-      this.onDeviceStateListChanged.callListeners();
-      this.methodCalled('enableNetworkType');
-    },
-
-    /** @override */
-    disableNetworkType: function(type) {
-      this.deviceStates_[type].State = 'Disabled';
-      this.onDeviceStateListChanged.callListeners();
-      this.methodCalled('disableNetworkType');
-    },
-
-    /** @override */
-    requestNetworkScan: function() {
-      this.methodCalled('requestNetworkScan');
-    },
-
-    /** @override */
-    startConnect: assertNotReached,
-
-    /** @override */
-    startDisconnect: assertNotReached,
-
-    /** @override */
-    startActivate: assertNotReached,
-
-    /** @override */
-    verifyDestination: assertNotReached,
-
-    /** @override */
-    verifyAndEncryptCredentials: assertNotReached,
-
-    /** @override */
-    verifyAndEncryptData: assertNotReached,
-
-    /** @override */
-    setWifiTDLSEnabledState: assertNotReached,
-
-    /** @override */
-    getWifiTDLSStatus: assertNotReached,
-
-    /** @override */
-    getCaptivePortalStatus: assertNotReached,
-
-    /** @override */
-    unlockCellularSim: assertNotReached,
-
-    /** @override */
-    setCellularSimState: assertNotReached,
-
-    /** @override */
-    selectCellularMobileNetwork: assertNotReached,
-
-    /** @override */
-    getGlobalPolicy: function(callback) {
-      callback(this.globalPolicy_);
-      this.methodCalled('getGlobalPolicy');
-    },
-
-    /** @override */
-    getCertificateLists: function(callback) {
-      callback(this.certificateLists_);
-      this.methodCalled('getCertificateLists');
-    },
-
-    /** @type {!FakeChromeEvent} */
-    onNetworksChanged: new FakeChromeEvent(),
-
-    /** @type {!FakeChromeEvent} */
-    onNetworkListChanged: new FakeChromeEvent(),
-
-    /** @type {!FakeChromeEvent} */
-    onDeviceStateListChanged: new FakeChromeEvent(),
-
-    /** @type {!FakeChromeEvent} */
-    onActiveNetworksChanged: new FakeChromeEvent(),
-
-    /** @type {!FakeChromeEvent} */
-    onPortalDetectionCompleted: new FakeChromeEvent(),
-
-    /** @type {!FakeChromeEvent} */
-    onCertificateListsChanged: new FakeChromeEvent(),
-  };
-
-  return {FakeNetworkingPrivate: FakeNetworkingPrivate};
-});
diff --git a/chrome/test/data/webui/cr_components/cr_components_browsertest.js b/chrome/test/data/webui/cr_components/cr_components_browsertest.js
index c016b5b..f86c7fd 100644
--- a/chrome/test/data/webui/cr_components/cr_components_browsertest.js
+++ b/chrome/test/data/webui/cr_components/cr_components_browsertest.js
@@ -95,7 +95,6 @@
     '//ui/webui/resources/js/promise_resolver.js',
     '../fake_chrome_event.js',
     '../chromeos/networking_private_constants.js',
-    '../chromeos/fake_networking_private.js',
     '../chromeos/fake_network_config_mojom.js',
     '../chromeos/cr_onc_strings.js',
     'network_config_test.js',
diff --git a/chrome/test/data/webui/cr_components/network_config_test.js b/chrome/test/data/webui/cr_components/network_config_test.js
index f0aaf30..0219d8d2 100644
--- a/chrome/test/data/webui/cr_components/network_config_test.js
+++ b/chrome/test/data/webui/cr_components/network_config_test.js
@@ -5,14 +5,10 @@
 suite('network-config', function() {
   var networkConfig;
 
-  /** @type {NetworkingPrivate} */
-  var api_;
-
   /** @type {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
   let mojoApi_ = null;
 
   suiteSetup(function() {
-    api_ = new chrome.FakeNetworkingPrivate();  // For certificates
     mojoApi_ = new FakeNetworkConfig();
     network_config.MojoInterfaceProviderImpl.getInstance().remote_ = mojoApi_;
     CrOncTest.overrideCrOncStrings();
@@ -23,7 +19,6 @@
     mojoApi_.setManagedPropertiesForTest(properties);
     PolymerTest.clearBody();
     networkConfig = document.createElement('network-config');
-    networkConfig.networkingPrivate = api_;
     networkConfig.guid = properties.guid;
     networkConfig.managedProperties = properties;
   }
@@ -31,7 +26,6 @@
   function setNetworkType(type, security) {
     PolymerTest.clearBody();
     networkConfig = document.createElement('network-config');
-    networkConfig.networkingPrivate = api_;
     networkConfig.type = OncMojo.getNetworkTypeString(type);
     if (security !== undefined) {
       networkConfig.securityType = security;
@@ -131,8 +125,7 @@
       const kHash1 = 'TESTHASH1', kHash2 = 'TESTHASH2';
       var clientCert = {hash: kHash1, hardwareBacked: true, deviceWide: false};
       var caCert = {hash: kHash2, hardwareBacked: true, deviceWide: true};
-      api_.setCertificatesForTest(
-          {serverCaCertificates: [caCert], userCertificates: [clientCert]});
+      mojoApi_.setCertificatesForTest([caCert], [clientCert]);
       this.selectedUserCertHash_ = kHash1;
       this.selectedServerCaHash_ = kHash2;
     }
@@ -255,32 +248,34 @@
       setCertificatesForTest();
       setAuthenticated();
       initNetworkConfig();
-      return flushAsync().then(() => {
-        let outer = networkConfig.$$('#outer');
-        assertEquals('EAP-TLS', outer.value);
+      return mojoApi_.whenCalled('getNetworkCertificates').then(() => {
+        return flushAsync().then(() => {
+          let outer = networkConfig.$$('#outer');
+          assertEquals('EAP-TLS', outer.value);
 
-        // check that a valid client user certificate is selected
-        let clientCert = networkConfig.$$('#userCert').$$('select').value;
-        assertTrue(!!clientCert);
-        let caCert = networkConfig.$$('#serverCa').$$('select').value;
-        assertTrue(!!caCert);
+          // check that a valid client user certificate is selected
+          let clientCert = networkConfig.$$('#userCert').$$('select').value;
+          assertTrue(!!clientCert);
+          let caCert = networkConfig.$$('#serverCa').$$('select').value;
+          assertTrue(!!caCert);
 
-        let share = networkConfig.$$('#share');
-        assertTrue(!!share);
-        // share the EAP TLS network
-        share.checked = true;
-        // trigger the onShareChanged_ event
-        var event = new Event('change');
-        share.dispatchEvent(event);
-        // check that share is enabled
-        assertTrue(share.checked);
+          let share = networkConfig.$$('#share');
+          assertTrue(!!share);
+          // share the EAP TLS network
+          share.checked = true;
+          // trigger the onShareChanged_ event
+          var event = new Event('change');
+          share.dispatchEvent(event);
+          // check that share is enabled
+          assertTrue(share.checked);
 
-        // check that client certificate selection is empty
-        clientCert = networkConfig.$$('#userCert').$$('select').value;
-        assertFalse(!!clientCert);
-        // check that ca device-wide cert is still selected
-        caCert = networkConfig.$$('#serverCa').$$('select').value;
-        assertTrue(!!caCert);
+          // check that client certificate selection is empty
+          clientCert = networkConfig.$$('#userCert').$$('select').value;
+          assertFalse(!!clientCert);
+          // check that ca device-wide cert is still selected
+          caCert = networkConfig.$$('#serverCa').$$('select').value;
+          assertTrue(!!caCert);
+        });
       });
     });
   });
diff --git a/chrome/test/data/webui/settings/chromeos/device_page_tests.js b/chrome/test/data/webui/settings/chromeos/device_page_tests.js
index 24b1a9b6..d2b71f3 100644
--- a/chrome/test/data/webui/settings/chromeos/device_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/device_page_tests.js
@@ -8,6 +8,7 @@
     DevicePage: 'device page',
     Display: 'display',
     Keyboard: 'keyboard',
+    NightLight: 'night light',
     Pointers: 'pointers',
     Power: 'power',
     Stylus: 'stylus',
@@ -411,6 +412,26 @@
       return Promise.resolve(page);
     }
 
+    /** @param {number} n The number of the display to add. */
+    function addDisplay(n) {
+      const display = {
+        id: 'fakeDisplayId' + n,
+        name: 'fakeDisplayName' + n,
+        mirroring: '',
+        isPrimary: n == 1,
+        rotation: 0,
+        modes: [],
+        bounds: {
+          left: 0,
+          top: 0,
+          width: 1920,
+          height: 1080,
+        },
+        availableDisplayZoomFactors: [1, 1.25, 1.5, 2],
+      };
+      fakeSystemDisplay.addDisplayForTest(display);
+    }
+
     /**
      * @param {settings.IdleBehavior} idleBehavior
      * @param {boolean} idleControlled
@@ -720,25 +741,6 @@
     });
 
     test(assert(TestNames.Display), function() {
-      const addDisplay = function(n) {
-        const display = {
-          id: 'fakeDisplayId' + n,
-          name: 'fakeDisplayName' + n,
-          mirroring: '',
-          isPrimary: n == 1,
-          rotation: 0,
-          modes: [],
-          bounds: {
-            left: 0,
-            top: 0,
-            width: 1920,
-            height: 1080,
-          },
-          availableDisplayZoomFactors: [1, 1.25, 1.5, 2],
-        };
-        fakeSystemDisplay.addDisplayForTest(display);
-      };
-
       let displayPage;
       return Promise
           .all([
@@ -894,6 +896,33 @@
           });
     });
 
+    test(assert(TestNames.NightLight), async function() {
+      // Set up a single display.
+      const displayPage =
+          await showAndGetDeviceSubpage('display', settings.routes.DISPLAY);
+      await fakeSystemDisplay.getInfoCalled.promise;
+      addDisplay(1);
+      fakeSystemDisplay.onDisplayChanged.callListeners();
+      await fakeSystemDisplay.getInfoCalled.promise;
+      await fakeSystemDisplay.getLayoutCalled.promise;
+      expectEquals(1, displayPage.displays.length);
+
+      // Night Light is off, so advanced controls are hidden.
+      expectFalse(!!displayPage.$$('#nightLightTemperatureDiv'));
+      expectFalse(!!displayPage.$$('#nightLightScheduleTypeDropDown'));
+
+      // Enable Night Light. Use an atomic update of |displayPage.prefs| so
+      // Polymer notices the change.
+      const newPrefs = getFakePrefs();
+      newPrefs.ash.night_light.enabled.value = true;
+      displayPage.prefs = newPrefs;
+      Polymer.dom.flush();
+
+      // Advanced Night Light controls are available.
+      expectTrue(!!displayPage.$$('#nightLightTemperatureDiv'));
+      expectTrue(!!displayPage.$$('#nightLightScheduleTypeDropDown'));
+    });
+
     suite(assert(TestNames.Power), function() {
       /**
        * Sets power sources using a deep copy of |sources|.
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
index 3f1844942..b5e3b276 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
@@ -399,6 +399,10 @@
   mocha.grep(assert(device_page_tests.TestNames.Keyboard)).run();
 });
 
+TEST_F('OSSettingsDevicePageTest', 'NightLightTest', () => {
+  mocha.grep(assert(device_page_tests.TestNames.NightLight)).run();
+});
+
 TEST_F('OSSettingsDevicePageTest', 'PointersTest', () => {
   mocha.grep(assert(device_page_tests.TestNames.Pointers)).run();
 });
diff --git a/chromeos/services/network_config/public/mojom/cros_network_config.mojom b/chromeos/services/network_config/public/mojom/cros_network_config.mojom
index f5bd8e5c..a9548c37 100644
--- a/chromeos/services/network_config/public/mojom/cros_network_config.mojom
+++ b/chromeos/services/network_config/public/mojom/cros_network_config.mojom
@@ -677,7 +677,7 @@
   bool save_credentials = false;
   array<string>? server_ca_pems;
   string? subject_match;
-  bool use_system_cas = true;
+  bool use_system_cas = false;
 };
 
 // Subset of currently implemented config properties in the UI. Additional
diff --git a/components/about_ui/android/BUILD.gn b/components/about_ui/android/BUILD.gn
index 3c5d221..031cc1b 100644
--- a/components/about_ui/android/BUILD.gn
+++ b/components/about_ui/android/BUILD.gn
@@ -13,5 +13,7 @@
   java_files = [ "java/src/org/chromium/components/aboutui/CreditUtils.java" ]
   deps = [
     "//base:base_java",
+    "//base:jni_java",
   ]
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
 }
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 0183dd2..f27a81d 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
@@ -5,12 +5,16 @@
 package org.chromium.components.aboutui;
 
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 
 /** Credits-related utilities. */
 @JNINamespace("about_ui")
 public class CreditUtils {
     private CreditUtils() {}
 
-    /** Writes the chrome://credits HTML to the given descriptor. */
-    public static native void nativeWriteCreditsHtml(int fd);
+    @NativeMethods
+    public interface Natives {
+        /** Writes the chrome://credits HTML to the given descriptor. */
+        void writeCreditsHtml(int fd);
+    }
 }
diff --git a/components/autofill/android/BUILD.gn b/components/autofill/android/BUILD.gn
index f1b025b34..3313c234 100644
--- a/components/autofill/android/BUILD.gn
+++ b/components/autofill/android/BUILD.gn
@@ -100,10 +100,12 @@
 android_library("provider_java") {
   deps = [
     "//base:base_java",
+    "//base:jni_java",
     "//components/autofill/core/common/mojom:mojo_types_java",
     "//content/public/android:content_java",
     "//third_party/android_deps:androidx_annotation_annotation_java",
   ]
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   java_files = [
     "java/src/org/chromium/components/autofill/AutofillProvider.java",
     "java/src/org/chromium/components/autofill/FormData.java",
diff --git a/components/autofill/android/java/src/org/chromium/components/autofill/AutofillProvider.java b/components/autofill/android/java/src/org/chromium/components/autofill/AutofillProvider.java
index 0937a50..a7d05d3 100644
--- a/components/autofill/android/java/src/org/chromium/components/autofill/AutofillProvider.java
+++ b/components/autofill/android/java/src/org/chromium/components/autofill/AutofillProvider.java
@@ -11,6 +11,7 @@
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.content_public.browser.WebContents;
 
 /**
@@ -132,7 +133,8 @@
      * @param formData the form to fill.
      */
     protected void autofill(long nativeAutofillProvider, FormData formData) {
-        nativeOnAutofillAvailable(nativeAutofillProvider, formData);
+        AutofillProviderJni.get().onAutofillAvailable(
+                nativeAutofillProvider, AutofillProvider.this, formData);
     }
 
     /**
@@ -147,6 +149,9 @@
     @CalledByNative
     protected abstract void onDidFillAutofillFormData();
 
-    private native void nativeOnAutofillAvailable(
-            long nativeAutofillProviderAndroid, FormData formData);
+    @NativeMethods
+    interface Natives {
+        void onAutofillAvailable(
+                long nativeAutofillProviderAndroid, AutofillProvider caller, FormData formData);
+    }
 }
diff --git a/components/autofill/android/java/src/org/chromium/components/autofill/FormData.java b/components/autofill/android/java/src/org/chromium/components/autofill/FormData.java
index ca1362a2..5c4db2d 100644
--- a/components/autofill/android/java/src/org/chromium/components/autofill/FormData.java
+++ b/components/autofill/android/java/src/org/chromium/components/autofill/FormData.java
@@ -6,6 +6,7 @@
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 
 import java.util.ArrayList;
 
@@ -35,10 +36,11 @@
     }
 
     private void popupFormFields(int fieldCount) {
-        FormFieldData formFieldData = nativeGetNextFormFieldData(mNativeObj);
+        FormFieldData formFieldData =
+                FormDataJni.get().getNextFormFieldData(mNativeObj, FormData.this);
         while (formFieldData != null) {
             mFields.add(formFieldData);
-            formFieldData = nativeGetNextFormFieldData(mNativeObj);
+            formFieldData = FormDataJni.get().getNextFormFieldData(mNativeObj, FormData.this);
         }
         assert mFields.size() == fieldCount;
     }
@@ -48,5 +50,8 @@
         mNativeObj = 0;
     }
 
-    private native FormFieldData nativeGetNextFormFieldData(long nativeFormDataAndroid);
+    @NativeMethods
+    interface Natives {
+        FormFieldData getNextFormFieldData(long nativeFormDataAndroid, FormData caller);
+    }
 }
diff --git a/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc b/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc
index d780ede6..f7f343a 100644
--- a/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc
+++ b/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc
@@ -117,10 +117,6 @@
 void AutofillWebDataBackendImpl::NotifyOfMultipleAutofillChanges() {
   DCHECK(owning_task_runner()->RunsTasksInCurrentSequence());
 
-  // DB sequence notification.
-  for (auto& db_observer : db_observer_list_)
-    db_observer.AutofillMultipleChangedBySync();
-
   // UI sequence notification.
   ui_task_runner_->PostTask(FROM_HERE, on_changed_callback_);
 }
diff --git a/components/autofill/core/browser/webdata/autofill_webdata_service_observer.h b/components/autofill/core/browser/webdata/autofill_webdata_service_observer.h
index 7fd955e..60820bb 100644
--- a/components/autofill/core/browser/webdata/autofill_webdata_service_observer.h
+++ b/components/autofill/core/browser/webdata/autofill_webdata_service_observer.h
@@ -23,13 +23,6 @@
   // the WebDatabase.
   virtual void CreditCardChanged(const CreditCardChange& change) {}
 
-  // Called on DB sequence when multiple Autofill entries have been modified by
-  // Sync.
-  // TODO(crbug.com/900607): Remove AutofillMultipleChangedBySync() from
-  // AutofillWebDataServiceObserverOnDBSequence once USS for wallet_metadata
-  // launches.
-  virtual void AutofillMultipleChangedBySync() {}
-
  protected:
   virtual ~AutofillWebDataServiceObserverOnDBSequence() {}
 };
diff --git a/components/component_updater/installer_policies/BUILD.gn b/components/component_updater/installer_policies/BUILD.gn
new file mode 100644
index 0000000..5adc7401
--- /dev/null
+++ b/components/component_updater/installer_policies/BUILD.gn
@@ -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.
+
+static_library("installer_policies") {
+  sources = [
+    "on_device_head_suggest_component_installer.cc",
+    "on_device_head_suggest_component_installer.h",
+  ]
+
+  deps = [
+    "//base",
+    "//components/component_updater",
+    "//components/omnibox/browser",
+    "//components/omnibox/common",
+  ]
+}
diff --git a/components/component_updater/installer_policies/DEPS b/components/component_updater/installer_policies/DEPS
new file mode 100644
index 0000000..473dc87c
--- /dev/null
+++ b/components/component_updater/installer_policies/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+  "+components/omnibox/browser",
+  "+components/omnibox/common",
+]
diff --git a/chrome/browser/component_updater/on_device_head_suggest_component_installer.cc b/components/component_updater/installer_policies/on_device_head_suggest_component_installer.cc
similarity index 83%
rename from chrome/browser/component_updater/on_device_head_suggest_component_installer.cc
rename to components/component_updater/installer_policies/on_device_head_suggest_component_installer.cc
index 8a66db5..87b64e6a 100644
--- a/chrome/browser/component_updater/on_device_head_suggest_component_installer.cc
+++ b/components/component_updater/installer_policies/on_device_head_suggest_component_installer.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/component_updater/on_device_head_suggest_component_installer.h"
+#include "components/component_updater/installer_policies/on_device_head_suggest_component_installer.h"
 
 #include <cstdint>
 #include <memory>
@@ -13,7 +13,6 @@
 #include "base/metrics/field_trial_params.h"
 #include "base/path_service.h"
 #include "base/strings/string_util.h"
-#include "chrome/browser/browser_process.h"
 #include "components/component_updater/component_installer.h"
 #include "components/component_updater/component_updater_service.h"
 #include "components/omnibox/browser/on_device_model_update_listener.h"
@@ -28,14 +27,14 @@
     0xdc, 0x4b, 0xce, 0xec, 0xe2, 0xa3, 0xb0, 0x47, 0x00, 0x3d, 0xb8,
     0xcf, 0x8e, 0x0f, 0x4a, 0x73, 0xa1, 0x89, 0x1f, 0x5f, 0x38};
 
-// Normalizes and returns current application locale, i.e capitalizes all
-// letters and removes all hyphens and underscores in the locale string,
-// e.g. "en-US" -> "ENUS".
-std::string GetNormalizedLocale() {
+// Get the normalized locale from a given raw locale, i.e capitalizes all
+// letters and removes all hyphens and underscores in the locale string, e.g.
+// "en-US" -> "ENUS".
+std::string GetNormalizedLocale(const std::string& raw_locale) {
   std::string locale = base::GetFieldTrialParamValueByFeature(
       omnibox::kOnDeviceHeadProvider, "ForceModelLocaleConstraint");
   if (locale.empty())
-    locale = g_browser_process->GetApplicationLocale();
+    locale = raw_locale;
 
   for (const auto c : "-_")
     locale.erase(std::remove(locale.begin(), locale.end(), c), locale.end());
@@ -49,8 +48,9 @@
 
 }  // namespace
 
-OnDeviceHeadSuggestInstallerPolicy::OnDeviceHeadSuggestInstallerPolicy()
-    : accept_locale_(GetNormalizedLocale()) {}
+OnDeviceHeadSuggestInstallerPolicy::OnDeviceHeadSuggestInstallerPolicy(
+    const std::string& locale)
+    : accept_locale_(GetNormalizedLocale(locale)) {}
 
 OnDeviceHeadSuggestInstallerPolicy::~OnDeviceHeadSuggestInstallerPolicy() =
     default;
@@ -63,7 +63,12 @@
   if (!name || *name != ("OnDeviceHeadSuggest" + accept_locale_))
     return false;
 
-  return base::PathExists(install_dir);
+  bool is_successful = base::PathExists(install_dir);
+  VLOG(1) << "On Device head model "
+          << (is_successful ? "is successfully" : "cannot be")
+          << " installed at directory: " << install_dir.value();
+
+  return is_successful;
 }
 
 bool OnDeviceHeadSuggestInstallerPolicy::
@@ -118,10 +123,11 @@
   return std::vector<std::string>();
 }
 
-void RegisterOnDeviceHeadSuggestComponent(ComponentUpdateService* cus) {
+void RegisterOnDeviceHeadSuggestComponent(ComponentUpdateService* cus,
+                                          const std::string& locale) {
   if (base::FeatureList::IsEnabled(omnibox::kOnDeviceHeadProvider)) {
     auto installer = base::MakeRefCounted<ComponentInstaller>(
-        std::make_unique<OnDeviceHeadSuggestInstallerPolicy>());
+        std::make_unique<OnDeviceHeadSuggestInstallerPolicy>(locale));
     installer->Register(cus, base::OnceClosure());
   }
 }
diff --git a/chrome/browser/component_updater/on_device_head_suggest_component_installer.h b/components/component_updater/installer_policies/on_device_head_suggest_component_installer.h
similarity index 83%
rename from chrome/browser/component_updater/on_device_head_suggest_component_installer.h
rename to components/component_updater/installer_policies/on_device_head_suggest_component_installer.h
index 438e287..2b43f435 100644
--- a/chrome/browser/component_updater/on_device_head_suggest_component_installer.h
+++ b/components/component_updater/installer_policies/on_device_head_suggest_component_installer.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_COMPONENT_UPDATER_ON_DEVICE_HEAD_SUGGEST_COMPONENT_INSTALLER_H_
-#define CHROME_BROWSER_COMPONENT_UPDATER_ON_DEVICE_HEAD_SUGGEST_COMPONENT_INSTALLER_H_
+#ifndef COMPONENTS_COMPONENT_UPDATER_INSTALLER_POLICIES_ON_DEVICE_HEAD_SUGGEST_COMPONENT_INSTALLER_H_
+#define COMPONENTS_COMPONENT_UPDATER_INSTALLER_POLICIES_ON_DEVICE_HEAD_SUGGEST_COMPONENT_INSTALLER_H_
 
 #include <vector>
 
@@ -22,7 +22,7 @@
 // OnDeviceHeadProvider.
 class OnDeviceHeadSuggestInstallerPolicy : public ComponentInstallerPolicy {
  public:
-  OnDeviceHeadSuggestInstallerPolicy();
+  OnDeviceHeadSuggestInstallerPolicy(const std::string& locale);
   ~OnDeviceHeadSuggestInstallerPolicy() override;
 
  private:
@@ -51,8 +51,9 @@
   DISALLOW_COPY_AND_ASSIGN(OnDeviceHeadSuggestInstallerPolicy);
 };
 
-// Registers a OnDeviceHeadSuggest component with |cus|.
-void RegisterOnDeviceHeadSuggestComponent(ComponentUpdateService* cus);
+// Registers an OnDeviceHeadSuggest component with |cus|.
+void RegisterOnDeviceHeadSuggestComponent(ComponentUpdateService* cus,
+                                          const std::string& locale);
 
 }  // namespace component_updater
 
diff --git a/components/content_capture/android/BUILD.gn b/components/content_capture/android/BUILD.gn
index a044b90..57d30c3 100644
--- a/components/content_capture/android/BUILD.gn
+++ b/components/content_capture/android/BUILD.gn
@@ -22,8 +22,10 @@
 android_library("java") {
   deps = [
     "//base:base_java",
+    "//base:jni_java",
     "//content/public/android:content_java",
   ]
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   java_files = [
     "java/src/org/chromium/components/content_capture/ContentCaptureConsumer.java",
     "java/src/org/chromium/components/content_capture/ContentCaptureController.java",
diff --git a/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureController.java b/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureController.java
index 118b4fb..e01c16f 100644
--- a/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureController.java
+++ b/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureController.java
@@ -6,6 +6,7 @@
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 
 /**
  * The abstract class to provide the whitelist and the runtime control of if ContentCapture should
@@ -25,7 +26,7 @@
     }
 
     protected ContentCaptureController() {
-        mNativeContentCaptureController = nativeInit(this);
+        mNativeContentCaptureController = ContentCaptureControllerJni.get().init(this);
     }
 
     /**
@@ -59,10 +60,14 @@
      * @param isRegex to indicate that the corresponding whitelist is the regex or not.
      */
     protected void setWhitelist(String[] whitelist, boolean[] isRegex) {
-        nativeSetWhitelist(mNativeContentCaptureController, whitelist, isRegex);
+        ContentCaptureControllerJni.get().setWhitelist(
+                mNativeContentCaptureController, ContentCaptureController.this, whitelist, isRegex);
     }
 
-    private static native long nativeInit(Object contentCaptureController);
-    private native void nativeSetWhitelist(
-            long nativeContentCaptureController, String[] whitelist, boolean[] isRegex);
+    @NativeMethods
+    interface Natives {
+        long init(Object contentCaptureController);
+        void setWhitelist(long nativeContentCaptureController, ContentCaptureController caller,
+                String[] whitelist, boolean[] isRegex);
+    }
 }
diff --git a/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureFeatures.java b/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureFeatures.java
index 7400008..e1b83e2 100644
--- a/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureFeatures.java
+++ b/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureFeatures.java
@@ -4,6 +4,7 @@
 package org.chromium.components.content_capture;
 
 import org.chromium.base.CommandLine;
+import org.chromium.base.annotations.NativeMethods;
 
 /**
  * The class to get if feature is enabled from native.
@@ -12,11 +13,15 @@
     private static final String FLAG = "dump-captured-content-to-logcat-for-testing";
 
     public static boolean isEnabled() {
-        return nativeIsEnabled();
+        return ContentCaptureFeaturesJni.get().isEnabled();
     }
 
     public static boolean isDumpForTestingEnabled() {
         return CommandLine.getInstance().hasSwitch(FLAG);
     }
-    private static native boolean nativeIsEnabled();
+
+    @NativeMethods
+    interface Natives {
+        boolean isEnabled();
+    }
 }
diff --git a/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureReceiverManager.java b/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureReceiverManager.java
index 3654a5e..4fb015f 100644
--- a/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureReceiverManager.java
+++ b/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureReceiverManager.java
@@ -6,6 +6,7 @@
 
 import org.chromium.base.Log;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.content_public.browser.WebContents;
 
 import java.util.Arrays;
@@ -20,7 +21,7 @@
     private ContentCaptureConsumer mContentCaptureConsumer;
 
     public static ContentCaptureReceiverManager createOrGet(WebContents webContents) {
-        return nativeCreateOrGet(webContents);
+        return ContentCaptureReceiverManagerJni.get().createOrGet(webContents);
     }
 
     @CalledByNative
@@ -51,8 +52,9 @@
     @CalledByNative
     private void didRemoveContent(Object[] session, long[] data) {
         FrameSession frameSession = toFrameSession(session);
-        if (mContentCaptureConsumer != null)
+        if (mContentCaptureConsumer != null) {
             mContentCaptureConsumer.onContentRemoved(frameSession, data);
+        }
         if (sDump.booleanValue()) {
             Log.i(TAG, "Removed Content: %s", frameSession.get(0) + " " + Arrays.toString(data));
         }
@@ -71,5 +73,8 @@
         return frameSession;
     }
 
-    private static native ContentCaptureReceiverManager nativeCreateOrGet(WebContents webContents);
+    @NativeMethods
+    interface Natives {
+        ContentCaptureReceiverManager createOrGet(WebContents webContents);
+    }
 }
diff --git a/components/crash/android/BUILD.gn b/components/crash/android/BUILD.gn
index 53c02f3..a007800 100644
--- a/components/crash/android/BUILD.gn
+++ b/components/crash/android/BUILD.gn
@@ -23,7 +23,9 @@
 android_library("java") {
   deps = [
     "//base:base_java",
+    "//base:jni_java",
   ]
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   srcjar_deps = [ ":java_enums_srcjar" ]
   java_files = _jni_sources
 }
@@ -62,7 +64,9 @@
 android_library("handler_java") {
   deps = [
     "//base:base_java",
+    "//base:jni_java",
   ]
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   java_files = _java_handler_jni_sources
 }
 
diff --git a/components/crash/android/java/src/org/chromium/components/crash/CrashKeys.java b/components/crash/android/java/src/org/chromium/components/crash/CrashKeys.java
index 99c7f3c..c629d58 100644
--- a/components/crash/android/java/src/org/chromium/components/crash/CrashKeys.java
+++ b/components/crash/android/java/src/org/chromium/components/crash/CrashKeys.java
@@ -8,6 +8,7 @@
 
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 
 import java.util.concurrent.atomic.AtomicReferenceArray;
 
@@ -74,7 +75,7 @@
     public void set(@CrashKeyIndex int keyIndex, @Nullable String value) {
         ThreadUtils.assertOnUiThread();
         if (mFlushed) {
-            nativeSet(keyIndex, value);
+            CrashKeysJni.get().set(CrashKeys.this, keyIndex, value);
             return;
         }
         mValues.set(keyIndex, value);
@@ -90,10 +91,13 @@
 
         assert !mFlushed;
         for (@CrashKeyIndex int i = 0; i < mValues.length(); i++) {
-            nativeSet(i, mValues.getAndSet(i, null));
+            CrashKeysJni.get().set(CrashKeys.this, i, mValues.getAndSet(i, null));
         }
         mFlushed = true;
     }
 
-    private native void nativeSet(int key, String value);
+    @NativeMethods
+    interface Natives {
+        void set(CrashKeys caller, int key, String value);
+    }
 }
diff --git a/components/crash/android/java/src/org/chromium/components/crash/browser/CrashpadMain.java b/components/crash/android/java/src/org/chromium/components/crash/browser/CrashpadMain.java
index 1add0b6..e4b79e4 100644
--- a/components/crash/android/java/src/org/chromium/components/crash/browser/CrashpadMain.java
+++ b/components/crash/android/java/src/org/chromium/components/crash/browser/CrashpadMain.java
@@ -5,6 +5,7 @@
 package org.chromium.components.crash.browser;
 
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.annotations.UsedByReflection;
 import org.chromium.base.library_loader.NativeLibraries;
 
@@ -19,8 +20,11 @@
         } catch (UnsatisfiedLinkError e) {
             throw new RuntimeException(e);
         }
-        nativeCrashpadMain(argv);
+        CrashpadMainJni.get().crashpadMain(argv);
     }
 
-    private static native void nativeCrashpadMain(String[] argv);
+    @NativeMethods
+    interface Natives {
+        void crashpadMain(String[] argv);
+    }
 }
diff --git a/components/cronet/android/BUILD.gn b/components/cronet/android/BUILD.gn
index 63344e8..54c9c0e 100644
--- a/components/cronet/android/BUILD.gn
+++ b/components/cronet/android/BUILD.gn
@@ -925,6 +925,7 @@
   android_library("cronet_common_javatests") {
     testonly = true
     java_files = [
+      "test/javatests/src/org/chromium/net/TestUploadDataProvider.java",
       "test/javatests/src/org/chromium/net/TestUrlRequestCallback.java",
       "test/javatests/src/org/chromium/net/CronetTestRule.java",
     ]
@@ -1005,7 +1006,6 @@
       "test/javatests/src/org/chromium/net/TestDrivenDataProvider.java",
       "test/javatests/src/org/chromium/net/TestNetworkQualityRttListener.java",
       "test/javatests/src/org/chromium/net/TestNetworkQualityThroughputListener.java",
-      "test/javatests/src/org/chromium/net/TestUploadDataProvider.java",
       "test/javatests/src/org/chromium/net/UploadDataProvidersTest.java",
       "test/javatests/src/org/chromium/net/urlconnection/CronetBufferedOutputStreamTest.java",
       "test/javatests/src/org/chromium/net/urlconnection/CronetChunkedOutputStreamTest.java",
diff --git a/components/cronet/android/fake/java/org/chromium/net/test/FakeCronetController.java b/components/cronet/android/fake/java/org/chromium/net/test/FakeCronetController.java
index 2a768c6a..d045ba2 100644
--- a/components/cronet/android/fake/java/org/chromium/net/test/FakeCronetController.java
+++ b/components/cronet/android/fake/java/org/chromium/net/test/FakeCronetController.java
@@ -178,14 +178,15 @@
      * @param url        the URL that the {@link UrlRequest} is connecting to
      * @param httpMethod the HTTP method that the {@link UrlRequest} is using to connect with
      * @param headers    the headers supplied by the {@link UrlRequest}
+     * @param body       the body of the fake HTTP request
      * @return a {@link FakeUrlResponse} if there is one, or a failed "404" response if none found
      */
     FakeUrlResponse getResponse(
-            String url, String httpMethod, List<Map.Entry<String, String>> headers) {
+            String url, String httpMethod, List<Map.Entry<String, String>> headers, byte[] body) {
         synchronized (mResponseMatchers) {
             for (ResponseMatcher responseMatcher : mResponseMatchers) {
                 FakeUrlResponse matchedResponse =
-                        responseMatcher.getMatchingResponse(url, httpMethod, headers);
+                        responseMatcher.getMatchingResponse(url, httpMethod, headers, body);
                 if (matchedResponse != null) {
                     return matchedResponse;
                 }
diff --git a/components/cronet/android/fake/java/org/chromium/net/test/FakeUrlRequest.java b/components/cronet/android/fake/java/org/chromium/net/test/FakeUrlRequest.java
index a388338..01feedb0 100644
--- a/components/cronet/android/fake/java/org/chromium/net/test/FakeUrlRequest.java
+++ b/components/cronet/android/fake/java/org/chromium/net/test/FakeUrlRequest.java
@@ -4,7 +4,10 @@
 
 package org.chromium.net.test;
 
+import android.util.Log;
+
 import androidx.annotation.GuardedBy;
+import androidx.annotation.VisibleForTesting;
 
 import org.chromium.net.CronetException;
 import org.chromium.net.InlineExecutionProhibitedException;
@@ -12,6 +15,8 @@
 import org.chromium.net.UrlResponseInfo;
 import org.chromium.net.impl.CallbackExceptionImpl;
 import org.chromium.net.impl.CronetExceptionImpl;
+import org.chromium.net.impl.JavaUploadDataSinkBase;
+import org.chromium.net.impl.JavaUrlRequestUtils;
 import org.chromium.net.impl.JavaUrlRequestUtils.CheckedRunnable;
 import org.chromium.net.impl.JavaUrlRequestUtils.DirectPreventingExecutor;
 import org.chromium.net.impl.JavaUrlRequestUtils.State;
@@ -19,6 +24,8 @@
 import org.chromium.net.impl.UrlRequestBase;
 import org.chromium.net.impl.UrlResponseInfoImpl;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.net.URI;
 import java.nio.ByteBuffer;
 import java.util.AbstractMap;
@@ -28,12 +35,16 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Executor;
+import java.util.concurrent.RejectedExecutionException;
 
 /**
  * Fake UrlRequest that retrieves responses from the associated FakeCronetController. Used for
  * testing Cronet usage on Android.
  */
 final class FakeUrlRequest extends UrlRequestBase {
+    private static final int DEFAULT_UPLOAD_BUFFER_SIZE = 8192;
+    // Used for logging errors.
+    private static final String TAG = FakeUrlRequest.class.getSimpleName();
     // Callback used to report responses to the client.
     private final Callback mCallback;
     // The {@link Executor} provided by the user to be used for callbacks.
@@ -46,6 +57,8 @@
     private final FakeCronetEngine mFakeCronetEngine;
     // Source of thread safety for this class.
     private final Object mLock = new Object();
+    // True if direct execution is allowed for this request.
+    private final boolean mAllowDirectExecutor;
     // The chain of URL's this request has received.
     @GuardedBy("mLock")
     private final List<String> mUrlChain = new ArrayList<>();
@@ -58,6 +71,19 @@
     // The {@link FakeUrlResponse} for the current URL.
     @GuardedBy("mLock")
     private FakeUrlResponse mCurrentFakeResponse;
+    // The body of the request from UploadDataProvider.
+    @GuardedBy("mLock")
+    private byte[] mRequestBody;
+    // The {@link UploadDataProvider} to retrieve a request body from.
+    @GuardedBy("mLock")
+    private UploadDataProvider mUploadDataProvider;
+    // The executor to call the {@link UploadDataProvider}'s callback methods with.
+    @GuardedBy("mLock")
+    private Executor mUploadExecutor;
+    // The {@link UploadDataSink} for the {@link UploadDataProvider}.
+    @GuardedBy("mLock")
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    FakeDataSink mFakeDataSink;
     // The {@link UrlResponseInfo} for the current request.
     @GuardedBy("mLock")
     private UrlResponseInfo mUrlResponseInfo;
@@ -66,7 +92,10 @@
     private ByteBuffer mResponse;
     // The HTTP method used by this request to establish a connection.
     @GuardedBy("mLock")
-    private String mHttpMethod = "GET";
+    private String mHttpMethod;
+    // True after the {@link UploadDataProvider} for this request has been closed.
+    @GuardedBy("mLock")
+    private boolean mUploadProviderClosed;
 
     @GuardedBy("mLock")
     @State
@@ -84,7 +113,7 @@
     /**
      * Used to map from HTTP status codes to the corresponding human-readable text.
      */
-    private final static Map<Integer, String> HTTP_STATUS_CODE_TO_TEXT;
+    private static final Map<Integer, String> HTTP_STATUS_CODE_TO_TEXT;
     static {
         Map<Integer, String> httpCodeMap = new HashMap<>();
         httpCodeMap.put(100, "Continue");
@@ -172,13 +201,26 @@
         mCurrentUrl = url;
         mFakeCronetController = fakeCronetController;
         mFakeCronetEngine = fakeCronetEngine;
+        mAllowDirectExecutor = allowDirectExecutor;
     }
 
     @Override
     public void setUploadDataProvider(UploadDataProvider uploadDataProvider, Executor executor) {
+        if (uploadDataProvider == null) {
+            throw new NullPointerException("Invalid UploadDataProvider.");
+        }
         synchronized (mLock) {
+            if (!checkHasContentTypeHeader()) {
+                throw new IllegalArgumentException(
+                        "Requests with upload data must have a Content-Type.");
+            }
             checkNotStarted();
-            // TODO(kirchman) Implement UploadDataProvider.
+            if (mHttpMethod == null) {
+                mHttpMethod = "POST";
+            }
+            mUploadExecutor =
+                    mAllowDirectExecutor ? executor : new DirectPreventingExecutor(executor);
+            mUploadDataProvider = uploadDataProvider;
         }
     }
 
@@ -229,11 +271,17 @@
                     transitionedState = true;
                 } finally {
                     if (!transitionedState) {
-                        mFakeCronetEngine.onRequestDestroyed();
+                        cleanup();
                     }
                 }
                 mUrlChain.add(mCurrentUrl);
-                fakeConnect();
+                if (mUploadDataProvider != null) {
+                    mFakeDataSink =
+                            new FakeDataSink(mUploadExecutor, mExecutor, mUploadDataProvider);
+                    mFakeDataSink.start(/* firstTime= */ true);
+                } else {
+                    fakeConnect();
+                }
             } else {
                 throw new IllegalStateException("This request's CronetEngine is already shutdown.");
             }
@@ -247,8 +295,8 @@
     @GuardedBy("mLock")
     private void fakeConnect() {
         mAdditionalStatusDetails = Status.WAITING_FOR_RESPONSE;
-        mCurrentFakeResponse =
-                mFakeCronetController.getResponse(mCurrentUrl, mHttpMethod, mAllHeadersList);
+        mCurrentFakeResponse = mFakeCronetController.getResponse(
+                mCurrentUrl, mHttpMethod, mAllHeadersList, mRequestBody);
         int responseCode = mCurrentFakeResponse.getHttpStatusCode();
         mUrlResponseInfo = new UrlResponseInfoImpl(
                 Collections.unmodifiableList(new ArrayList<>(mUrlChain)), responseCode,
@@ -261,6 +309,7 @@
         if (responseCode >= 300 && responseCode < 400) {
             processRedirectResponse();
         } else {
+            closeUploadDataProvider();
             final UrlResponseInfo info = mUrlResponseInfo;
             transitionStates(State.STARTED, State.AWAITING_READ);
             executeCheckedRunnable(new CheckedRunnable() {
@@ -373,7 +422,12 @@
     public void followRedirect() {
         synchronized (mLock) {
             transitionStates(State.AWAITING_FOLLOW_REDIRECT, State.STARTED);
-            fakeConnect();
+            if (mFakeDataSink != null) {
+                mFakeDataSink = new FakeDataSink(mUploadExecutor, mExecutor, mUploadDataProvider);
+                mFakeDataSink.start(/* firstTime= */ false);
+            } else {
+                fakeConnect();
+            }
         }
     }
 
@@ -395,7 +449,7 @@
     @Override
     public void getStatus(final StatusListener listener) {
         synchronized (mLock) {
-            int extraStatus = this.mAdditionalStatusDetails;
+            int extraStatus = mAdditionalStatusDetails;
 
             @StatusValues
             final int status;
@@ -478,7 +532,7 @@
      *
      * @param checkedRunnable the runnable to execute
      */
-    private void executeCheckedRunnable(CheckedRunnable checkedRunnable) {
+    private void executeCheckedRunnable(JavaUrlRequestUtils.CheckedRunnable checkedRunnable) {
         try {
             mUserExecutor.execute(new Runnable() {
                 @Override
@@ -493,7 +547,8 @@
             });
         } catch (InlineExecutionProhibitedException e) {
             // Don't try to fail using the {@code mUserExecutor} because it produced this error.
-            tryToFailWithException(new CronetExceptionImpl("Direct executor not allowed", e));
+            tryToFailWithException(
+                    new CronetExceptionImpl("Exception posting task to executor", e));
         }
     }
 
@@ -517,12 +572,168 @@
                 return false; // Already in a terminal state
             default: {
                 mState = terminalState;
-                mFakeCronetEngine.onRequestDestroyed();
+                cleanup();
                 return true;
             }
         }
     }
 
+    @GuardedBy("mLock")
+    private void cleanup() {
+        closeUploadDataProvider();
+        mFakeCronetEngine.onRequestDestroyed();
+    }
+
+    /**
+     * Executed only once after the request has finished using the {@link UploadDataProvider}.
+     * Closes the {@link UploadDataProvider} if it exists and has not already been closed.
+     */
+    @GuardedBy("mLock")
+    private void closeUploadDataProvider() {
+        if (mUploadDataProvider != null && !mUploadProviderClosed) {
+            try {
+                mUploadExecutor.execute(uploadErrorSetting(new CheckedRunnable() {
+                    @Override
+                    public void run() throws Exception {
+                        synchronized (mLock) {
+                            mUploadDataProvider.close();
+                            mUploadProviderClosed = true;
+                        }
+                    }
+                }));
+            } catch (RejectedExecutionException e) {
+                Log.e(TAG, "Exception when closing uploadDataProvider", e);
+            }
+        }
+    }
+
+    /**
+     * Wraps a {@link CheckedRunnable} in a runnable that will attempt to fail the request if there
+     * is an exception.
+     *
+     * @param delegate the {@link CheckedRunnable} to try to run
+     * @return a {@link Runnable} that wraps the delegate runnable.
+     */
+    private Runnable uploadErrorSetting(final CheckedRunnable delegate) {
+        return new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    delegate.run();
+                } catch (Throwable t) {
+                    enterUploadErrorState(t);
+                }
+            }
+        };
+    }
+
+    /**
+     * Fails the request with an error. Called when uploading the request body using an
+     * {@link UploadDataProvider} fails.
+     *
+     * @param error the error that caused this request to fail which should be returned to the
+     *              {@link UrlRequest.Callback}
+     */
+    private void enterUploadErrorState(final Throwable error) {
+        synchronized (mLock) {
+            mUserExecutor.execute(new Runnable() {
+                @Override
+                public void run() {
+                    tryToFailWithException(new CronetExceptionImpl(
+                            "Exception received from UploadDataProvider", error));
+                }
+            });
+        }
+    }
+
+    /**
+     * Adapted from {@link JavaUrlRequest.OutputStreamDataSink}. Stores the received message in a
+     * {@link ByteArrayOutputStream} and transfers it to the {@code mRequestBody} when the response
+     * has been fully acquired.
+     */
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    final class FakeDataSink extends JavaUploadDataSinkBase {
+        private final ByteArrayOutputStream mTotalUploadStream = new ByteArrayOutputStream();
+
+        FakeDataSink(final Executor userExecutor, Executor executor, UploadDataProvider provider) {
+            super(userExecutor, executor, provider);
+        }
+
+        @Override
+        public Runnable getErrorSettingRunnable(JavaUrlRequestUtils.CheckedRunnable runnable) {
+            return new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        runnable.run();
+                    } catch (Throwable t) {
+                        mUserExecutor.execute(new Runnable() {
+                            @Override
+                            public void run() {
+                                tryToFailWithException(new CronetExceptionImpl("System error", t));
+                            }
+                        });
+                    }
+                }
+            };
+        }
+
+        @Override
+        protected Runnable getUploadErrorSettingRunnable(
+                JavaUrlRequestUtils.CheckedRunnable runnable) {
+            return uploadErrorSetting(runnable);
+        }
+
+        @Override
+        protected void processUploadError(final Throwable error) {
+            enterUploadErrorState(error);
+        }
+
+        @Override
+        protected int processSuccessfulRead(ByteBuffer buffer) throws IOException {
+            mTotalUploadStream.write(buffer.array(), buffer.arrayOffset(), buffer.remaining());
+            return buffer.remaining();
+        }
+
+        /**
+         * Terminates the upload stage of the request. Writes the received bytes to the byte array:
+         * {@code mRequestBody}. Connects to the current URL for this request.
+         */
+        @Override
+        protected void finish() throws IOException {
+            synchronized (mLock) {
+                mRequestBody = mTotalUploadStream.toByteArray();
+                fakeConnect();
+            }
+        }
+
+        @Override
+        protected void initializeRead() throws IOException {
+            // Nothing to do before every read in this implementation.
+        }
+
+        @Override
+        protected void initializeStart(long totalBytes) {
+            // Nothing to do to initialize the upload in this implementation.
+        }
+    }
+
+    /**
+     * Verifies that the "content-type" header is present. Must be checked before an
+     * {@link UploadDataProvider} is premitted to be set.
+     *
+     * @return true if the "content-type" header is present in the request headers.
+     */
+    @GuardedBy("mLock")
+    private boolean checkHasContentTypeHeader() {
+        for (Map.Entry<String, String> entry : mAllHeadersList) {
+            if (entry.getKey().equalsIgnoreCase("content-type")) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     /**
      * Gets a human readable description for a HTTP status code.
      *
diff --git a/components/cronet/android/fake/java/org/chromium/net/test/FakeUrlResponse.java b/components/cronet/android/fake/java/org/chromium/net/test/FakeUrlResponse.java
index e6b6675..38b078d 100644
--- a/components/cronet/android/fake/java/org/chromium/net/test/FakeUrlResponse.java
+++ b/components/cronet/android/fake/java/org/chromium/net/test/FakeUrlResponse.java
@@ -110,7 +110,7 @@
          * Sets the HTTP status code. The default value is 200.
          *
          * @param httpStatusCode for {@link UrlResponseInfo.getHttpStatusCode()}
-         * @return a builder with the corresponding HTTP status code set
+         * @return the builder with the corresponding HTTP status code set
          */
         public Builder setHttpStatusCode(int httpStatusCode) {
             mHttpStatusCode = httpStatusCode;
@@ -122,7 +122,7 @@
          *
          * @param name  the name of the header key, for example, "location" for a redirect header
          * @param value the header value
-         * @return a builder with the corresponding header set
+         * @return the builder with the corresponding header set
          */
         public Builder addHeader(String name, String value) {
             mAllHeadersList.add(new AbstractMap.SimpleEntry<>(name, value));
@@ -133,7 +133,7 @@
          * Sets result of {@link UrlResponseInfo.wasCached()}. The default wasCached value is false.
          *
          * @param wasCached for {@link UrlResponseInfo.wasCached()}
-         * @return a builder with the corresponding wasCached field set
+         * @return the builder with the corresponding wasCached field set
          */
         public Builder setWasCached(boolean wasCached) {
             mWasCached = wasCached;
@@ -145,7 +145,7 @@
          * protocol is an empty string.
          *
          * @param negotiatedProtocol for {@link UrlResponseInfo.getNegotiatedProtocol()}
-         * @return a builder with the corresponding negotiatedProtocol field set
+         * @return the builder with the corresponding negotiatedProtocol field set
          */
         public Builder setNegotiatedProtocol(String negotiatedProtocol) {
             mNegotiatedProtocol = negotiatedProtocol;
@@ -157,7 +157,7 @@
          * empty string.
          *
          * @param proxyServer for {@link UrlResponseInfo.getProxyServer()}
-         * @return a builder with the corresponding proxyServer field set
+         * @return the builder with the corresponding proxyServer field set
          */
         public Builder setProxyServer(String proxyServer) {
             mProxyServer = proxyServer;
@@ -167,8 +167,8 @@
         /**
          * Sets the response body for a response. The default response body is an empty byte array.
          *
-         * @param responseBody all the information the server returns
-         * @return a builder with the corresponding responseBody field set
+         * @param body all the information the server returns
+         * @return the builder with the corresponding responseBody field set
          */
         public Builder setResponseBody(byte[] body) {
             mResponseBody = body;
diff --git a/components/cronet/android/fake/java/org/chromium/net/test/ResponseMatcher.java b/components/cronet/android/fake/java/org/chromium/net/test/ResponseMatcher.java
index c4b4f0f..28c0702 100644
--- a/components/cronet/android/fake/java/org/chromium/net/test/ResponseMatcher.java
+++ b/components/cronet/android/fake/java/org/chromium/net/test/ResponseMatcher.java
@@ -21,9 +21,10 @@
      * @param url the URL the {@link UrlRequest} is connecting to
      * @param httpMethod the HTTP method the {@link UrlRequest} is connecting with
      * @param headers the {@link UrlRequest} headers
+     * @param body the body of the request
      * @return a {@link FakeUrlResponse} if there is a matching response, or {@code null} otherwise
      */
     @Nullable
     FakeUrlResponse getMatchingResponse(
-            String url, String httpMethod, List<Map.Entry<String, String>> headers);
+            String url, String httpMethod, List<Map.Entry<String, String>> headers, byte[] body);
 }
diff --git a/components/cronet/android/fake/java/org/chromium/net/test/UrlResponseMatcher.java b/components/cronet/android/fake/java/org/chromium/net/test/UrlResponseMatcher.java
index a1b676d..2bb55ab 100644
--- a/components/cronet/android/fake/java/org/chromium/net/test/UrlResponseMatcher.java
+++ b/components/cronet/android/fake/java/org/chromium/net/test/UrlResponseMatcher.java
@@ -35,7 +35,7 @@
 
     @Override
     public FakeUrlResponse getMatchingResponse(
-            String url, String httpMethod, List<Map.Entry<String, String>> headers) {
+            String url, String httpMethod, List<Map.Entry<String, String>> headers, byte[] body) {
         return mUrl.equals(url) ? mResponse : null;
     }
 }
diff --git a/components/cronet/android/fake/javatests/org/chromium/net/test/FakeCronetControllerTest.java b/components/cronet/android/fake/javatests/org/chromium/net/test/FakeCronetControllerTest.java
index d662326b..99cbdc5 100644
--- a/components/cronet/android/fake/javatests/org/chromium/net/test/FakeCronetControllerTest.java
+++ b/components/cronet/android/fake/javatests/org/chromium/net/test/FakeCronetControllerTest.java
@@ -140,7 +140,7 @@
         mFakeCronetController.addSuccessResponse(url, "different text".getBytes());
 
         FakeUrlResponse foundResponse =
-                mFakeCronetController.getResponse(new String(url), null, null);
+                mFakeCronetController.getResponse(new String(url), null, null, null);
 
         assertEquals(response, foundResponse);
     }
@@ -155,7 +155,7 @@
         mFakeCronetController.addResponseMatcher(matcher);
         mFakeCronetController.removeResponseMatcher(matcher);
 
-        FakeUrlResponse foundResponse = mFakeCronetController.getResponse(url, null, null);
+        FakeUrlResponse foundResponse = mFakeCronetController.getResponse(url, null, null, null);
 
         assertEquals(404, foundResponse.getHttpStatusCode());
         assertNotEquals(response, foundResponse);
@@ -171,7 +171,7 @@
         mFakeCronetController.addResponseMatcher(matcher);
         mFakeCronetController.clearResponseMatchers();
 
-        FakeUrlResponse foundResponse = mFakeCronetController.getResponse(url, null, null);
+        FakeUrlResponse foundResponse = mFakeCronetController.getResponse(url, null, null, null);
 
         assertEquals(404, foundResponse.getHttpStatusCode());
         assertNotEquals(response, foundResponse);
@@ -185,7 +185,7 @@
                 new FakeUrlResponse.Builder().setResponseBody("body text".getBytes()).build();
         mFakeCronetController.addResponseForUrl(response, url);
 
-        FakeUrlResponse foundResponse = mFakeCronetController.getResponse(url, null, null);
+        FakeUrlResponse foundResponse = mFakeCronetController.getResponse(url, null, null, null);
 
         assertEquals(foundResponse, response);
     }
@@ -193,7 +193,7 @@
     @Test
     @SmallTest
     public void testDefaultResponseIs404() {
-        FakeUrlResponse foundResponse = mFakeCronetController.getResponse("url", null, null);
+        FakeUrlResponse foundResponse = mFakeCronetController.getResponse("url", null, null, null);
 
         assertEquals(404, foundResponse.getHttpStatusCode());
     }
@@ -205,7 +205,7 @@
         String location = "/TEST_REDIRECT_LOCATION";
         mFakeCronetController.addRedirectResponse(location, url);
 
-        FakeUrlResponse foundResponse = mFakeCronetController.getResponse("url", null, null);
+        FakeUrlResponse foundResponse = mFakeCronetController.getResponse("url", null, null, null);
         Map.Entry<String, String> headerEntry = new AbstractMap.SimpleEntry<>("location", location);
 
         assertTrue(foundResponse.getAllHeadersList().contains(headerEntry));
@@ -220,7 +220,7 @@
         int httpStatusCode = 400;
         mFakeCronetController.addHttpErrorResponse(httpStatusCode, url);
 
-        FakeUrlResponse foundResponse = mFakeCronetController.getResponse(url, null, null);
+        FakeUrlResponse foundResponse = mFakeCronetController.getResponse(url, null, null, null);
 
         assertEquals(foundResponse.getHttpStatusCode(), httpStatusCode);
     }
@@ -245,7 +245,7 @@
         String body = "TEST_BODY";
         mFakeCronetController.addSuccessResponse(url, body.getBytes());
 
-        FakeUrlResponse foundResponse = mFakeCronetController.getResponse(url, null, null);
+        FakeUrlResponse foundResponse = mFakeCronetController.getResponse(url, null, null, null);
 
         assertTrue(foundResponse.getHttpStatusCode() >= 200);
         assertTrue(foundResponse.getHttpStatusCode() < 300);
diff --git a/components/cronet/android/fake/javatests/org/chromium/net/test/FakeUrlRequestTest.java b/components/cronet/android/fake/javatests/org/chromium/net/test/FakeUrlRequestTest.java
index c20da41..a846e19 100644
--- a/components/cronet/android/fake/javatests/org/chromium/net/test/FakeUrlRequestTest.java
+++ b/components/cronet/android/fake/javatests/org/chromium/net/test/FakeUrlRequestTest.java
@@ -5,11 +5,13 @@
 package org.chromium.net.test;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.times;
 
+import static org.chromium.net.CronetTestRule.assertContains;
 import static org.chromium.net.TestUrlRequestCallback.ResponseStep.ON_CANCELED;
 
 import android.content.Context;
@@ -27,11 +29,17 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.net.CronetEngine;
 import org.chromium.net.InlineExecutionProhibitedException;
+import org.chromium.net.TestUploadDataProvider;
 import org.chromium.net.TestUrlRequestCallback;
+import org.chromium.net.UploadDataProvider;
+import org.chromium.net.UploadDataProviders;
+import org.chromium.net.UploadDataSink;
 import org.chromium.net.UrlRequest.Status;
 import org.chromium.net.UrlRequest.StatusListener;
 
+import java.io.IOException;
 import java.net.URI;
+import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -39,6 +47,7 @@
 import java.util.Objects;
 import java.util.concurrent.Executor;
 import java.util.concurrent.atomic.AtomicBoolean;
+
 /**
  * Test functionality of FakeUrlRequest.
  */
@@ -63,6 +72,27 @@
         foundStatus.block();
     }
 
+    private class EchoBodyResponseMatcher implements ResponseMatcher {
+        private final String mUrl;
+
+        EchoBodyResponseMatcher(String url) {
+            mUrl = url;
+        }
+
+        EchoBodyResponseMatcher() {
+            this(null);
+        }
+
+        @Override
+        public FakeUrlResponse getMatchingResponse(String url, String httpMethod,
+                List<Map.Entry<String, String>> headers, byte[] body) {
+            if (mUrl == null || mUrl.equals(url)) {
+                return new FakeUrlResponse.Builder().setResponseBody(body).build();
+            }
+            return null;
+        }
+    }
+
     @Before
     public void setUp() {
         mFakeCronetController = new FakeCronetController();
@@ -170,14 +200,15 @@
                 (FakeUrlRequest) mFakeCronetEngine
                         .newUrlRequestBuilder("url", callback, callback.getExecutor())
                         .build();
-        String testMethod = "POST";
-
+        String testMethod = "PUT";
+        // Use an atomic because it is set in an inner class. We do not actually need atomic for a
+        // multi-threaded operation here.
         AtomicBoolean foundMethod = new AtomicBoolean();
 
         mFakeCronetController.addResponseMatcher(new ResponseMatcher() {
             @Override
-            public FakeUrlResponse getMatchingResponse(
-                    String url, String httpMethod, List<Map.Entry<String, String>> headers) {
+            public FakeUrlResponse getMatchingResponse(String url, String httpMethod,
+                    List<Map.Entry<String, String>> headers, byte[] body) {
                 assertEquals(testMethod, httpMethod);
                 foundMethod.set(true);
                 // It doesn't matter if a response is actually returned.
@@ -206,11 +237,13 @@
         String headerKey = "HEADERNAME";
         String headerValue = "HEADERVALUE";
         request.addHeader(headerKey, headerValue);
+        // Use an atomic because it is set in an inner class. We do not actually need atomic for a
+        // multi-threaded operation here.
         AtomicBoolean foundEntry = new AtomicBoolean();
         mFakeCronetController.addResponseMatcher(new ResponseMatcher() {
             @Override
-            public FakeUrlResponse getMatchingResponse(
-                    String url, String httpMethod, List<Map.Entry<String, String>> headers) {
+            public FakeUrlResponse getMatchingResponse(String url, String httpMethod,
+                    List<Map.Entry<String, String>> headers, byte[] body) {
                 assertEquals(1, headers.size());
                 assertEquals(headerKey, headers.get(0).getKey());
                 assertEquals(headerValue, headers.get(0).getValue());
@@ -463,15 +496,19 @@
         TestUrlRequestCallback callback = Mockito.spy(new TestUrlRequestCallback());
         FakeUrlRequest request = (FakeUrlRequest) mFakeCronetEngine
                                          .newUrlRequestBuilder("", callback, callback.getExecutor())
+                                         .addHeader("Content-Type", "useless/string")
                                          .build();
-        request.setUploadDataProvider(null, null);
+        String body = "body";
+        request.setUploadDataProvider(
+                UploadDataProviders.create(body.getBytes()), callback.getExecutor());
         request.start();
         // Must wait for the request to prevent a race in the State since it is reported in the
         // error.
         callback.blockForDone();
 
         try {
-            request.setUploadDataProvider(null, null);
+            request.setUploadDataProvider(
+                    UploadDataProviders.create(body.getBytes()), callback.getExecutor());
             fail("UploadDataProvider cannot be changed after request has started");
         } catch (IllegalStateException e) {
             assertEquals("Request is already started. State is: 7", e.getMessage());
@@ -777,4 +814,783 @@
 
         assertEquals(404, callback.mResponseInfo.getHttpStatusCode());
     }
+
+    @Test
+    @SmallTest
+    public void testUploadSetDataProviderChecksForNullUploadDataProvider() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String url = "url";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, callback.getExecutor());
+
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher());
+
+        try {
+            builder.setUploadDataProvider(null, callback.getExecutor());
+            fail("Exception not thrown");
+        } catch (NullPointerException e) {
+            assertEquals("Invalid UploadDataProvider.", e.getMessage());
+        }
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadSetDataProviderChecksForContentTypeHeader() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String url = "url";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, callback.getExecutor());
+
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher());
+
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor());
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        try {
+            builder.build().start();
+            fail("Exception not thrown");
+        } catch (IllegalArgumentException e) {
+            assertEquals("Requests with upload data must have a Content-Type.", e.getMessage());
+        }
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadWithEmptyBody() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String url = "url";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, callback.getExecutor());
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher());
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor());
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+        builder.build().start();
+        callback.blockForDone();
+
+        assertNotNull(callback.mResponseInfo);
+        assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
+        assertEquals("", callback.mResponseAsString);
+        dataProvider.assertClosed();
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadSync() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String url = "url";
+        String body = "test";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, callback.getExecutor());
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor());
+
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher());
+        dataProvider.addRead(body.getBytes());
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+        builder.build().start();
+        callback.blockForDone();
+        dataProvider.assertClosed();
+
+        assertEquals(4, dataProvider.getUploadedLength());
+        assertEquals(1, dataProvider.getNumReadCalls());
+        assertEquals(0, dataProvider.getNumRewindCalls());
+
+        assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
+        assertEquals("test", callback.mResponseAsString);
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadSyncReadWrongState() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String url = "url";
+        String body = "test";
+        callback.setAutoAdvance(false);
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, callback.getExecutor());
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor());
+
+        // Add a redirect response so the request keeps the UploadDataProvider open while waiting
+        // to follow the redirect.
+        mFakeCronetController.addRedirectResponse("newUrl", url);
+        dataProvider.addRead(body.getBytes());
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+        FakeUrlRequest request = (FakeUrlRequest) builder.build();
+        request.start();
+        callback.waitForNextStep();
+        try {
+            request.mFakeDataSink.onReadSucceeded(false);
+            fail("Cannot read before upload has started");
+        } catch (IllegalStateException e) {
+            assertEquals("onReadSucceeded() called when not awaiting a read result; in state: 2",
+                    e.getMessage());
+        }
+        request.cancel();
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadSyncRewindWrongState() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String url = "url";
+        String body = "test";
+        callback.setAutoAdvance(false);
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, callback.getExecutor());
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor());
+
+        // Add a redirect response so the request keeps the UploadDataProvider open while waiting
+        // to follow the redirect.
+        mFakeCronetController.addRedirectResponse("newUrl", url);
+        dataProvider.addRead(body.getBytes());
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+        FakeUrlRequest request = (FakeUrlRequest) builder.build();
+        request.start();
+        callback.waitForNextStep();
+        try {
+            request.mFakeDataSink.onRewindSucceeded();
+            fail("Cannot rewind before upload has started");
+        } catch (IllegalStateException e) {
+            assertEquals("onRewindSucceeded() called when not awaiting a rewind; in state: 2",
+                    e.getMessage());
+        }
+        request.cancel();
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadMultiplePiecesSync() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String url = "url";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, callback.getExecutor());
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor());
+
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher());
+        dataProvider.addRead("Y".getBytes());
+        dataProvider.addRead("et ".getBytes());
+        dataProvider.addRead("another ".getBytes());
+        dataProvider.addRead("test".getBytes());
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+        builder.build().start();
+        callback.blockForDone();
+        dataProvider.assertClosed();
+
+        assertEquals(16, dataProvider.getUploadedLength());
+        assertEquals(4, dataProvider.getNumReadCalls());
+        assertEquals(0, dataProvider.getNumRewindCalls());
+
+        assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
+        assertEquals("Yet another test", callback.mResponseAsString);
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadMultiplePiecesAsync() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String url = "url";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, callback.getExecutor());
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher());
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.ASYNC, callback.getExecutor());
+        dataProvider.addRead("Y".getBytes());
+        dataProvider.addRead("et ".getBytes());
+        dataProvider.addRead("another ".getBytes());
+        dataProvider.addRead("test".getBytes());
+
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+        builder.build().start();
+        callback.blockForDone();
+        dataProvider.assertClosed();
+
+        assertEquals(16, dataProvider.getUploadedLength());
+        assertEquals(4, dataProvider.getNumReadCalls());
+        assertEquals(0, dataProvider.getNumRewindCalls());
+
+        assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
+        assertEquals("Yet another test", callback.mResponseAsString);
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadChangesDefaultMethod() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String url = "url";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, callback.getExecutor());
+        mFakeCronetController.addResponseMatcher(new ResponseMatcher() {
+            @Override
+            public FakeUrlResponse getMatchingResponse(String url, String httpMethod,
+                    List<Map.Entry<String, String>> headers, byte[] body) {
+                return new FakeUrlResponse.Builder().setResponseBody(httpMethod.getBytes()).build();
+            }
+        });
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor());
+        dataProvider.addRead("test".getBytes());
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+        builder.build().start();
+        callback.blockForDone();
+        dataProvider.assertClosed();
+
+        assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
+        assertEquals("POST", callback.mResponseAsString);
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadWithSetMethod() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String url = "url";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, callback.getExecutor());
+        mFakeCronetController.addResponseMatcher(new ResponseMatcher() {
+            @Override
+            public FakeUrlResponse getMatchingResponse(String url, String httpMethod,
+                    List<Map.Entry<String, String>> headers, byte[] body) {
+                return new FakeUrlResponse.Builder().setResponseBody(httpMethod.getBytes()).build();
+            }
+        });
+        final String method = "PUT";
+        builder.setHttpMethod(method);
+
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor());
+        dataProvider.addRead("test".getBytes());
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+        builder.build().start();
+        callback.blockForDone();
+        dataProvider.assertClosed();
+
+        assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
+        assertEquals("PUT", callback.mResponseAsString);
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadRedirectSync() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String redirectUrl = "redirectUrl";
+        String echoBodyUrl = "echobody";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        redirectUrl, callback, callback.getExecutor());
+        mFakeCronetController.addRedirectResponse(echoBodyUrl, redirectUrl);
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher(echoBodyUrl));
+
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor());
+        dataProvider.addRead("test".getBytes());
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+        builder.build().start();
+        callback.blockForDone();
+        dataProvider.assertClosed();
+
+        // 1 read call before the rewind, 1 after.
+        assertEquals(2, dataProvider.getNumReadCalls());
+        assertEquals(1, dataProvider.getNumRewindCalls());
+
+        assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
+        assertEquals("test", callback.mResponseAsString);
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadRedirectAsync() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String redirectUrl = "redirectUrl";
+        String echoBodyUrl = "echobody";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        redirectUrl, callback, callback.getExecutor());
+        mFakeCronetController.addRedirectResponse(echoBodyUrl, redirectUrl);
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher(echoBodyUrl));
+
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.ASYNC, callback.getExecutor());
+        dataProvider.addRead("test".getBytes());
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+        builder.build().start();
+        callback.blockForDone();
+        dataProvider.assertClosed();
+
+        // 1 read call before the rewind, 1 after.
+        assertEquals(2, dataProvider.getNumReadCalls());
+        assertEquals(1, dataProvider.getNumRewindCalls());
+
+        assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
+        assertEquals("test", callback.mResponseAsString);
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadWithBadLength() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String url = "url";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, callback.getExecutor());
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher());
+
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor()) {
+            @Override
+            public long getLength() throws IOException {
+                return 1;
+            }
+
+            @Override
+            public void read(UploadDataSink uploadDataSink, ByteBuffer byteBuffer)
+                    throws IOException {
+                byteBuffer.put("12".getBytes());
+                uploadDataSink.onReadSucceeded(false);
+            }
+        };
+
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+        builder.build().start();
+        callback.blockForDone();
+        dataProvider.assertClosed();
+
+        assertContains("Exception received from UploadDataProvider", callback.mError.getMessage());
+        assertContains("Read upload data length 2 exceeds expected length 1",
+                callback.mError.getCause().getMessage());
+        assertEquals(null, callback.mResponseInfo);
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadWithBadLengthBufferAligned() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String url = "url";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, callback.getExecutor());
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher());
+
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor()) {
+            @Override
+            public long getLength() throws IOException {
+                return 8191;
+            }
+
+            @Override
+            public void read(UploadDataSink uploadDataSink, ByteBuffer byteBuffer)
+                    throws IOException {
+                byteBuffer.put("0123456789abcdef".getBytes());
+                uploadDataSink.onReadSucceeded(false);
+            }
+        };
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+        builder.build().start();
+        callback.blockForDone();
+        dataProvider.assertClosed();
+        assertContains("Exception received from UploadDataProvider", callback.mError.getMessage());
+        assertContains("Read upload data length 8192 exceeds expected length 8191",
+                callback.mError.getCause().getMessage());
+        assertEquals(null, callback.mResponseInfo);
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadLengthFailSync() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String url = "url";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, callback.getExecutor());
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher());
+
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor());
+        dataProvider.setLengthFailure();
+        // This will never be read, but if the length is 0, read may never be
+        // called.
+        dataProvider.addRead("test".getBytes());
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+        builder.build().start();
+        callback.blockForDone();
+        dataProvider.assertClosed();
+
+        assertEquals(0, dataProvider.getNumReadCalls());
+        assertEquals(0, dataProvider.getNumRewindCalls());
+
+        assertContains("Exception received from UploadDataProvider", callback.mError.getMessage());
+        assertContains("Sync length failure", callback.mError.getCause().getMessage());
+        assertEquals(null, callback.mResponseInfo);
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadReadFailSync() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String url = "url";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, callback.getExecutor());
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher());
+
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor());
+        dataProvider.setReadFailure(
+                /* readFailIndex= */ 0, TestUploadDataProvider.FailMode.CALLBACK_SYNC);
+        // This will never be read, but if the length is 0, read may never be
+        // called.
+        dataProvider.addRead("test".getBytes());
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+        builder.build().start();
+        callback.blockForDone();
+        dataProvider.assertClosed();
+
+        assertEquals(1, dataProvider.getNumReadCalls());
+        assertEquals(0, dataProvider.getNumRewindCalls());
+
+        assertContains("Exception received from UploadDataProvider", callback.mError.getMessage());
+        assertContains("Sync read failure", callback.mError.getCause().getMessage());
+        assertEquals(null, callback.mResponseInfo);
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadReadFailAsync() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String url = "url";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, callback.getExecutor());
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher());
+
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor());
+        dataProvider.setReadFailure(
+                /* readFailIndex= */ 0, TestUploadDataProvider.FailMode.CALLBACK_ASYNC);
+        // This will never be read, but if the length is 0, read may never be
+        // called.
+        dataProvider.addRead("test".getBytes());
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+        builder.build().start();
+        callback.blockForDone();
+        dataProvider.assertClosed();
+
+        assertEquals(1, dataProvider.getNumReadCalls());
+        assertEquals(0, dataProvider.getNumRewindCalls());
+
+        assertContains("Exception received from UploadDataProvider", callback.mError.getMessage());
+        assertContains("Async read failure", callback.mError.getCause().getMessage());
+        assertEquals(null, callback.mResponseInfo);
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadReadFailThrown() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String url = "url";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, callback.getExecutor());
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher());
+
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor());
+        dataProvider.setReadFailure(/* readFailIndex= */ 0, TestUploadDataProvider.FailMode.THROWN);
+        // This will never be read, but if the length is 0, read may never be
+        // called.
+        dataProvider.addRead("test".getBytes());
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+        builder.build().start();
+        callback.blockForDone();
+        dataProvider.assertClosed();
+
+        assertEquals(1, dataProvider.getNumReadCalls());
+        assertEquals(0, dataProvider.getNumRewindCalls());
+
+        assertContains("Exception received from UploadDataProvider", callback.mError.getMessage());
+        assertContains("Thrown read failure", callback.mError.getCause().getMessage());
+        assertEquals(null, callback.mResponseInfo);
+    }
+
+    /** This test uses a direct executor for upload, and non direct for callbacks */
+    @Test
+    @SmallTest
+    public void testDirectExecutorUploadProhibitedByDefault() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        Executor myExecutor = new Executor() {
+            @Override
+            public void execute(Runnable command) {
+                command.run();
+            }
+        };
+        String url = "url";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, callback.getExecutor());
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher());
+
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, myExecutor);
+        // This will never be read, but if the length is 0, read may never be
+        // called.
+        dataProvider.addRead("test".getBytes());
+        builder.setUploadDataProvider(dataProvider, myExecutor);
+        builder.addHeader("Content-Type", "useless/string");
+        builder.build().start();
+        callback.blockForDone();
+
+        assertEquals(0, dataProvider.getNumReadCalls());
+        assertEquals(0, dataProvider.getNumRewindCalls());
+
+        assertContains("Exception received from UploadDataProvider", callback.mError.getMessage());
+        assertContains("Inline execution is prohibited for this request",
+                callback.mError.getCause().getMessage());
+        assertEquals(null, callback.mResponseInfo);
+    }
+
+    /** This test uses a direct executor for callbacks, and non direct for upload */
+    @Test
+    @SmallTest
+    public void testDirectExecutorProhibitedByDefault() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        Executor myExecutor = new Executor() {
+            @Override
+            public void execute(Runnable command) {
+                command.run();
+            }
+        };
+        String url = "url";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, myExecutor);
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher());
+
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor());
+        // This will never be read, but if the length is 0, read may never be
+        // called.
+        dataProvider.addRead("test".getBytes());
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+        builder.build().start();
+        callback.blockForDone();
+
+        assertEquals(1, dataProvider.getNumReadCalls());
+        assertEquals(0, dataProvider.getNumRewindCalls());
+
+        assertContains("Exception posting task to executor", callback.mError.getMessage());
+        assertContains("Inline execution is prohibited for this request",
+                callback.mError.getCause().getMessage());
+        assertEquals(null, callback.mResponseInfo);
+        dataProvider.assertClosed();
+    }
+
+    @Test
+    @SmallTest
+    public void testDirectExecutorAllowed() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        callback.setAllowDirectExecutor(true);
+        Executor myExecutor = new Executor() {
+            @Override
+            public void execute(Runnable command) {
+                command.run();
+            }
+        };
+        String url = "url";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, callback.getExecutor());
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher());
+        UploadDataProvider dataProvider = UploadDataProviders.create("test".getBytes());
+        builder.setUploadDataProvider(dataProvider, myExecutor);
+        builder.addHeader("Content-Type", "useless/string");
+        builder.allowDirectExecutor();
+        builder.build().start();
+        callback.blockForDone();
+
+        if (callback.mOnErrorCalled) {
+            throw callback.mError;
+        }
+
+        assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
+        assertEquals("test", callback.mResponseAsString);
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadRewindFailSync() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String redirectUrl = "redirectUrl";
+        String echoBodyUrl = "echobody";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        redirectUrl, callback, callback.getExecutor());
+        mFakeCronetController.addRedirectResponse(echoBodyUrl, redirectUrl);
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher(echoBodyUrl));
+
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor());
+        dataProvider.setRewindFailure(TestUploadDataProvider.FailMode.CALLBACK_SYNC);
+        dataProvider.addRead("test".getBytes());
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+        builder.build().start();
+        callback.blockForDone();
+        dataProvider.assertClosed();
+
+        assertEquals(1, dataProvider.getNumReadCalls());
+        assertEquals(1, dataProvider.getNumRewindCalls());
+
+        assertContains("Exception received from UploadDataProvider", callback.mError.getMessage());
+        assertContains("Sync rewind failure", callback.mError.getCause().getMessage());
+        assertEquals(null, callback.mResponseInfo);
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadRewindFailAsync() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String redirectUrl = "redirectUrl";
+        String echoBodyUrl = "echobody";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        redirectUrl, callback, callback.getExecutor());
+        mFakeCronetController.addRedirectResponse(echoBodyUrl, redirectUrl);
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher(echoBodyUrl));
+
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.ASYNC, callback.getExecutor());
+        dataProvider.setRewindFailure(TestUploadDataProvider.FailMode.CALLBACK_ASYNC);
+        dataProvider.addRead("test".getBytes());
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+        builder.build().start();
+        callback.blockForDone();
+        dataProvider.assertClosed();
+
+        assertEquals(1, dataProvider.getNumReadCalls());
+        assertEquals(1, dataProvider.getNumRewindCalls());
+
+        assertContains("Exception received from UploadDataProvider", callback.mError.getMessage());
+        assertContains("Async rewind failure", callback.mError.getCause().getMessage());
+        assertEquals(null, callback.mResponseInfo);
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadRewindFailThrown() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String redirectUrl = "redirectUrl";
+        String echoBodyUrl = "echobody";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        redirectUrl, callback, callback.getExecutor());
+        mFakeCronetController.addRedirectResponse(echoBodyUrl, redirectUrl);
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher(echoBodyUrl));
+
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor());
+        dataProvider.setRewindFailure(TestUploadDataProvider.FailMode.THROWN);
+        dataProvider.addRead("test".getBytes());
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+        builder.build().start();
+        callback.blockForDone();
+        dataProvider.assertClosed();
+
+        assertEquals(1, dataProvider.getNumReadCalls());
+        assertEquals(1, dataProvider.getNumRewindCalls());
+
+        assertContains("Exception received from UploadDataProvider", callback.mError.getMessage());
+        assertContains("Thrown rewind failure", callback.mError.getCause().getMessage());
+        assertEquals(null, callback.mResponseInfo);
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadChunked() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String url = "url";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, callback.getExecutor());
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher());
+
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor());
+        dataProvider.addRead("test hello".getBytes());
+        dataProvider.setChunked(true);
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+
+        assertEquals(-1, dataProvider.getUploadedLength());
+
+        builder.build().start();
+        callback.blockForDone();
+        dataProvider.assertClosed();
+
+        // 1 read call for one data chunk.
+        assertEquals(1, dataProvider.getNumReadCalls());
+        assertEquals("test hello", callback.mResponseAsString);
+    }
+
+    @Test
+    @SmallTest
+    public void testUploadChunkedLastReadZeroLengthBody() throws Exception {
+        TestUrlRequestCallback callback = new TestUrlRequestCallback();
+        String url = "url";
+        FakeUrlRequest.Builder builder =
+                (FakeUrlRequest.Builder) mFakeCronetEngine.newUrlRequestBuilder(
+                        url, callback, callback.getExecutor());
+        mFakeCronetController.addResponseMatcher(new EchoBodyResponseMatcher());
+
+        TestUploadDataProvider dataProvider = new TestUploadDataProvider(
+                TestUploadDataProvider.SuccessCallbackMode.SYNC, callback.getExecutor());
+        // Add 3 reads. The last read has a 0-length body.
+        dataProvider.addRead("hello there".getBytes());
+        dataProvider.addRead("!".getBytes());
+        dataProvider.addRead("".getBytes());
+        dataProvider.setChunked(true);
+        builder.setUploadDataProvider(dataProvider, callback.getExecutor());
+        builder.addHeader("Content-Type", "useless/string");
+
+        assertEquals(-1, dataProvider.getUploadedLength());
+
+        builder.build().start();
+        callback.blockForDone();
+        dataProvider.assertClosed();
+
+        // 2 read call for the first two data chunks, and 1 for final chunk.
+        assertEquals(3, dataProvider.getNumReadCalls());
+        assertEquals("hello there!", callback.mResponseAsString);
+    }
 }
diff --git a/components/cronet/android/fake/javatests/org/chromium/net/test/UrlResponseMatcherTest.java b/components/cronet/android/fake/javatests/org/chromium/net/test/UrlResponseMatcherTest.java
index 76710e6..390f5802 100644
--- a/components/cronet/android/fake/javatests/org/chromium/net/test/UrlResponseMatcherTest.java
+++ b/components/cronet/android/fake/javatests/org/chromium/net/test/UrlResponseMatcherTest.java
@@ -51,7 +51,7 @@
                 new FakeUrlResponse.Builder().setResponseBody("TestBody".getBytes()).build();
         ResponseMatcher matcher = new UrlResponseMatcher(url, response);
 
-        FakeUrlResponse found = matcher.getMatchingResponse(url, null, null);
+        FakeUrlResponse found = matcher.getMatchingResponse(url, null, null, null);
 
         assertNotNull(found);
         assertEquals(found, response);
@@ -66,7 +66,8 @@
                 new FakeUrlResponse.Builder().setResponseBody("TestBody".getBytes()).build();
         ResponseMatcher matcher = new UrlResponseMatcher(url, response);
 
-        FakeUrlResponse notFound = matcher.getMatchingResponse(urlWithoutResponse, null, null);
+        FakeUrlResponse notFound =
+                matcher.getMatchingResponse(urlWithoutResponse, null, null, null);
 
         assertNull(notFound);
     }
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/TestUploadDataProvider.java b/components/cronet/android/test/javatests/src/org/chromium/net/TestUploadDataProvider.java
index 94903aab..d492bde 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/TestUploadDataProvider.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/TestUploadDataProvider.java
@@ -16,22 +16,14 @@
 /**
  * An UploadDataProvider implementation used in tests.
  */
-class TestUploadDataProvider extends UploadDataProvider {
+public class TestUploadDataProvider extends UploadDataProvider {
     // Indicates whether all success callbacks are synchronous or asynchronous.
     // Doesn't apply to errors.
-    enum SuccessCallbackMode {
-        SYNC,
-        ASYNC
-    };
+    public enum SuccessCallbackMode { SYNC, ASYNC }
 
     // Indicates whether failures should throw exceptions, invoke callbacks
     // synchronously, or invoke callback asynchronously.
-    enum FailMode {
-        NONE,
-        THROWN,
-        CALLBACK_SYNC,
-        CALLBACK_ASYNC
-    };
+    public enum FailMode { NONE, THROWN, CALLBACK_SYNC, CALLBACK_ASYNC }
 
     private ArrayList<byte[]> mReads = new ArrayList<byte[]>();
     private final SuccessCallbackMode mSuccessCallbackMode;
@@ -61,7 +53,8 @@
     private AtomicBoolean mClosed = new AtomicBoolean(false);
     private ConditionVariable mAwaitingClose = new ConditionVariable(false);
 
-    TestUploadDataProvider(SuccessCallbackMode successCallbackMode, final Executor executor) {
+    public TestUploadDataProvider(
+            SuccessCallbackMode successCallbackMode, final Executor executor) {
         mSuccessCallbackMode = successCallbackMode;
         mExecutor = executor;
     }
diff --git a/components/cronet/url_request_context_config.cc b/components/cronet/url_request_context_config.cc
index 1d2db1cd..38934cf 100644
--- a/components/cronet/url_request_context_config.cc
+++ b/components/cronet/url_request_context_config.cc
@@ -90,6 +90,7 @@
 const char kQuicEnableSocketRecvOptimization[] =
     "enable_socket_recv_optimization";
 const char kQuicVersion[] = "quic_version";
+const char kQuicFlags[] = "set_quic_flags";
 
 // AsyncDNS experiment dictionary name.
 const char kAsyncDnsFieldTrialName[] = "AsyncDNS";
@@ -551,6 +552,19 @@
         }
       }
 
+      std::string quic_flags;
+      if (quic_args->GetString(kQuicFlags, &quic_flags)) {
+        for (const auto& flag :
+             base::SplitString(quic_flags, ",", base::TRIM_WHITESPACE,
+                               base::SPLIT_WANT_ALL)) {
+          std::vector<std::string> tokens = base::SplitString(
+              flag, "=", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
+          if (tokens.size() != 2)
+            continue;
+          SetQuicFlagByName(tokens[0], tokens[1]);
+        }
+      }
+
     } else if (it.key() == kAsyncDnsFieldTrialName) {
       const base::DictionaryValue* async_dns_args = nullptr;
       if (!it.value().GetAsDictionary(&async_dns_args)) {
diff --git a/components/cronet/url_request_context_config_unittest.cc b/components/cronet/url_request_context_config_unittest.cc
index 17b1cfb..71511f2 100644
--- a/components/cronet/url_request_context_config_unittest.cc
+++ b/components/cronet/url_request_context_config_unittest.cc
@@ -70,6 +70,10 @@
   options.SetPath({"QUIC", "close_sessions_on_ip_change"}, base::Value(true));
   options.SetPath({"QUIC", "race_cert_verification"}, base::Value(true));
   options.SetPath({"QUIC", "connection_options"}, base::Value("TIME,TBBR,REJ"));
+  options.SetPath(
+      {"QUIC", "set_quic_flags"},
+      base::Value("FLAGS_quic_reloadable_flag_quic_supports_tls_handshake=true,"
+                  "FLAGS_quic_reloadable_flag_quic_enable_version_99=true"));
   options.SetPath({"AsyncDNS", "enable"}, base::Value(true));
   options.SetPath({"NetworkErrorLogging", "enable"}, base::Value(true));
   options.SetPath({"NetworkErrorLogging", "preloaded_report_to_headers"},
@@ -140,6 +144,10 @@
   std::string options_json;
   EXPECT_TRUE(base::JSONWriter::Write(options, &options_json));
 
+  // Initialize QUIC flags set by the config.
+  FLAGS_quic_reloadable_flag_quic_supports_tls_handshake = false;
+  FLAGS_quic_reloadable_flag_quic_enable_version_99 = false;
+
   URLRequestContextConfig config(
       // Enable QUIC.
       true,
@@ -191,6 +199,9 @@
   quic_connection_options.push_back(quic::kREJ);
   EXPECT_EQ(quic_connection_options, params->quic_params.connection_options);
 
+  EXPECT_TRUE(FLAGS_quic_reloadable_flag_quic_supports_tls_handshake);
+  EXPECT_TRUE(FLAGS_quic_reloadable_flag_quic_enable_version_99);
+
   // Check Custom QUIC User Agent Id.
   EXPECT_EQ("Custom QUIC UAID", params->quic_params.user_agent_id);
 
diff --git a/components/dom_distiller/content/browser/android/BUILD.gn b/components/dom_distiller/content/browser/android/BUILD.gn
index 1cc66a9..e4c7c5e 100644
--- a/components/dom_distiller/content/browser/android/BUILD.gn
+++ b/components/dom_distiller/content/browser/android/BUILD.gn
@@ -7,9 +7,11 @@
 android_library("dom_distiller_content_java") {
   deps = [
     "//base:base_java",
+    "//base:jni_java",
     "//components/dom_distiller/core/android:dom_distiller_core_java",
     "//content/public/android:content_java",
   ]
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   java_files = [ "java/src/org/chromium/components/dom_distiller/content/DistillablePageUtils.java" ]
 }
 
diff --git a/components/dom_distiller/content/browser/android/java/src/org/chromium/components/dom_distiller/content/DistillablePageUtils.java b/components/dom_distiller/content/browser/android/java/src/org/chromium/components/dom_distiller/content/DistillablePageUtils.java
index 97b0ce64..8c64d71 100644
--- a/components/dom_distiller/content/browser/android/java/src/org/chromium/components/dom_distiller/content/DistillablePageUtils.java
+++ b/components/dom_distiller/content/browser/android/java/src/org/chromium/components/dom_distiller/content/DistillablePageUtils.java
@@ -6,6 +6,7 @@
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.content_public.browser.WebContents;
 
 /**
@@ -30,7 +31,7 @@
 
     public static void setDelegate(WebContents webContents,
             PageDistillableDelegate delegate) {
-        nativeSetDelegate(webContents, delegate);
+        DistillablePageUtilsJni.get().setDelegate(webContents, delegate);
     }
 
     @CalledByNative
@@ -41,6 +42,8 @@
         }
     }
 
-    private static native void nativeSetDelegate(
-            WebContents webContents, PageDistillableDelegate delegate);
+    @NativeMethods
+    interface Natives {
+        void setDelegate(WebContents webContents, PageDistillableDelegate delegate);
+    }
 }
diff --git a/components/dom_distiller/core/android/BUILD.gn b/components/dom_distiller/core/android/BUILD.gn
index 9dd2a4c1..e7e2d1b 100644
--- a/components/dom_distiller/core/android/BUILD.gn
+++ b/components/dom_distiller/core/android/BUILD.gn
@@ -7,7 +7,9 @@
 android_library("dom_distiller_core_java") {
   deps = [
     "//base:base_java",
+    "//base:jni_java",
   ]
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   java_files = [
     "java/src/org/chromium/components/dom_distiller/core/DomDistillerService.java",
     "java/src/org/chromium/components/dom_distiller/core/DomDistillerUrlUtils.java",
diff --git a/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DistilledPagePrefs.java b/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DistilledPagePrefs.java
index e42e478..183d45d 100644
--- a/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DistilledPagePrefs.java
+++ b/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DistilledPagePrefs.java
@@ -6,6 +6,7 @@
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -31,12 +32,13 @@
     /**
      * Wrapper for dom_distiller::android::DistilledPagePrefsObserverAndroid.
      */
-    private static class DistilledPagePrefsObserverWrapper {
+    static class DistilledPagePrefsObserverWrapper {
         private final Observer mDistilledPagePrefsObserver;
         private final long mNativeDistilledPagePrefsObserverAndroidPtr;
 
         public DistilledPagePrefsObserverWrapper(Observer observer) {
-            mNativeDistilledPagePrefsObserverAndroidPtr = nativeInitObserverAndroid(this);
+            mNativeDistilledPagePrefsObserverAndroidPtr =
+                    DistilledPagePrefsJni.get().initObserverAndroid(this);
             mDistilledPagePrefsObserver = observer;
         }
 
@@ -56,7 +58,8 @@
         }
 
         public void destroy() {
-            nativeDestroyObserverAndroid(mNativeDistilledPagePrefsObserverAndroidPtr);
+            DistilledPagePrefsJni.get().destroyObserverAndroid(
+                    mNativeDistilledPagePrefsObserverAndroidPtr);
         }
 
         public long getNativePtr() {
@@ -65,7 +68,8 @@
     }
 
     DistilledPagePrefs(long distilledPagePrefsPtr) {
-        mDistilledPagePrefsAndroid = nativeInit(distilledPagePrefsPtr);
+        mDistilledPagePrefsAndroid =
+                DistilledPagePrefsJni.get().init(DistilledPagePrefs.this, distilledPagePrefsPtr);
         mObserverMap = new HashMap<Observer, DistilledPagePrefsObserverWrapper>();
     }
 
@@ -77,7 +81,8 @@
         if (mObserverMap.containsKey(obs)) return false;
         DistilledPagePrefsObserverWrapper wrappedObserver =
                 new DistilledPagePrefsObserverWrapper(obs);
-        nativeAddObserver(mDistilledPagePrefsAndroid, wrappedObserver.getNativePtr());
+        DistilledPagePrefsJni.get().addObserver(mDistilledPagePrefsAndroid, DistilledPagePrefs.this,
+                wrappedObserver.getNativePtr());
         mObserverMap.put(obs, wrappedObserver);
         return true;
     }
@@ -89,57 +94,58 @@
     public boolean removeObserver(Observer obs) {
         DistilledPagePrefsObserverWrapper wrappedObserver = mObserverMap.remove(obs);
         if (wrappedObserver == null) return false;
-        nativeRemoveObserver(mDistilledPagePrefsAndroid, wrappedObserver.getNativePtr());
+        DistilledPagePrefsJni.get().removeObserver(mDistilledPagePrefsAndroid,
+                DistilledPagePrefs.this, wrappedObserver.getNativePtr());
         wrappedObserver.destroy();
         return true;
     }
 
     public void setFontFamily(@FontFamily int fontFamily) {
-        nativeSetFontFamily(mDistilledPagePrefsAndroid, fontFamily);
+        DistilledPagePrefsJni.get().setFontFamily(
+                mDistilledPagePrefsAndroid, DistilledPagePrefs.this, fontFamily);
     }
 
     public @FontFamily int getFontFamily() {
-        return nativeGetFontFamily(mDistilledPagePrefsAndroid);
+        return DistilledPagePrefsJni.get().getFontFamily(
+                mDistilledPagePrefsAndroid, DistilledPagePrefs.this);
     }
 
     public void setTheme(@Theme int theme) {
-        nativeSetTheme(mDistilledPagePrefsAndroid, theme);
+        DistilledPagePrefsJni.get().setTheme(
+                mDistilledPagePrefsAndroid, DistilledPagePrefs.this, theme);
     }
 
     public @Theme int getTheme() {
-        return nativeGetTheme(mDistilledPagePrefsAndroid);
+        return DistilledPagePrefsJni.get().getTheme(
+                mDistilledPagePrefsAndroid, DistilledPagePrefs.this);
     }
 
     public void setFontScaling(float scaling) {
-        nativeSetFontScaling(mDistilledPagePrefsAndroid, scaling);
+        DistilledPagePrefsJni.get().setFontScaling(
+                mDistilledPagePrefsAndroid, DistilledPagePrefs.this, scaling);
     }
 
     public float getFontScaling() {
-        return nativeGetFontScaling(mDistilledPagePrefsAndroid);
+        return DistilledPagePrefsJni.get().getFontScaling(
+                mDistilledPagePrefsAndroid, DistilledPagePrefs.this);
     }
 
-    private native long nativeInit(long distilledPagePrefPtr);
-
-    private native void nativeSetFontFamily(long nativeDistilledPagePrefsAndroid, int fontFamily);
-
-    private native int nativeGetFontFamily(long nativeDistilledPagePrefsAndroid);
-
-    private native void nativeSetTheme(long nativeDistilledPagePrefsAndroid, int theme);
-
-    private native int nativeGetTheme(long nativeDistilledPagePrefsAndroid);
-
-    private native void nativeSetFontScaling(long nativeDistilledPagePrefsAndroid, float scaling);
-
-    private native float nativeGetFontScaling(long nativeDistilledPagePrefsAndroid);
-
-    private native void nativeAddObserver(long nativeDistilledPagePrefsAndroid,
-            long nativeObserverPtr);
-
-    private native void nativeRemoveObserver(long nativeDistilledPagePrefsAndroid,
-            long nativeObserverPtr);
-
-    private static native long nativeInitObserverAndroid(DistilledPagePrefsObserverWrapper caller);
-
-    private static native void nativeDestroyObserverAndroid(
-            long nativeDistilledPagePrefsObserverAndroid);
+    @NativeMethods
+    interface Natives {
+        long init(DistilledPagePrefs caller, long distilledPagePrefPtr);
+        void setFontFamily(
+                long nativeDistilledPagePrefsAndroid, DistilledPagePrefs caller, int fontFamily);
+        int getFontFamily(long nativeDistilledPagePrefsAndroid, DistilledPagePrefs caller);
+        void setTheme(long nativeDistilledPagePrefsAndroid, DistilledPagePrefs caller, int theme);
+        int getTheme(long nativeDistilledPagePrefsAndroid, DistilledPagePrefs caller);
+        void setFontScaling(
+                long nativeDistilledPagePrefsAndroid, DistilledPagePrefs caller, float scaling);
+        float getFontScaling(long nativeDistilledPagePrefsAndroid, DistilledPagePrefs caller);
+        void addObserver(long nativeDistilledPagePrefsAndroid, DistilledPagePrefs caller,
+                long nativeObserverPtr);
+        void removeObserver(long nativeDistilledPagePrefsAndroid, DistilledPagePrefs caller,
+                long nativeObserverPtr);
+        long initObserverAndroid(DistilledPagePrefsObserverWrapper caller);
+        void destroyObserverAndroid(long nativeDistilledPagePrefsObserverAndroid);
+    }
 }
diff --git a/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DomDistillerService.java b/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DomDistillerService.java
index 80ec53fc..65894a7a 100644
--- a/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DomDistillerService.java
+++ b/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DomDistillerService.java
@@ -7,6 +7,7 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 
 /**
  * Wrapper for native dom_distiller::DomDistillerService.
@@ -20,7 +21,7 @@
     private DomDistillerService(long nativeDomDistillerAndroidServicePtr) {
         mDomDistillerServiceAndroid = nativeDomDistillerAndroidServicePtr;
         mDistilledPagePrefs = new DistilledPagePrefs(
-                nativeGetDistilledPagePrefsPtr(mDomDistillerServiceAndroid));
+                DomDistillerServiceJni.get().getDistilledPagePrefsPtr(mDomDistillerServiceAndroid));
     }
 
     public DistilledPagePrefs getDistilledPagePrefs() {
@@ -28,11 +29,13 @@
     }
 
     public boolean hasEntry(String entryId) {
-        return nativeHasEntry(mDomDistillerServiceAndroid, entryId);
+        return DomDistillerServiceJni.get().hasEntry(
+                mDomDistillerServiceAndroid, DomDistillerService.this, entryId);
     }
 
     public String getUrlForEntry(String entryId) {
-        return nativeGetUrlForEntry(mDomDistillerServiceAndroid, entryId);
+        return DomDistillerServiceJni.get().getUrlForEntry(
+                mDomDistillerServiceAndroid, DomDistillerService.this, entryId);
     }
 
     @CalledByNative
@@ -41,9 +44,12 @@
         return new DomDistillerService(nativeDomDistillerServiceAndroid);
     }
 
-    private native boolean nativeHasEntry(long nativeDomDistillerServiceAndroid, String entryId);
-    private native String nativeGetUrlForEntry(
-            long nativeDomDistillerServiceAndroid, String entryId);
-    private static native long nativeGetDistilledPagePrefsPtr(
-            long nativeDomDistillerServiceAndroid);
+    @NativeMethods
+    interface Natives {
+        boolean hasEntry(
+                long nativeDomDistillerServiceAndroid, DomDistillerService caller, String entryId);
+        String getUrlForEntry(
+                long nativeDomDistillerServiceAndroid, DomDistillerService caller, String entryId);
+        long getDistilledPagePrefsPtr(long nativeDomDistillerServiceAndroid);
+    }
 }
diff --git a/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DomDistillerUrlUtils.java b/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DomDistillerUrlUtils.java
index 1478be1..814c571 100644
--- a/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DomDistillerUrlUtils.java
+++ b/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DomDistillerUrlUtils.java
@@ -8,6 +8,7 @@
 
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 
 /**
  * Wrapper for the dom_distiller::url_utils.
@@ -28,7 +29,7 @@
     public static String getDistillerViewUrlFromUrl(String scheme, String url) {
         assert scheme != null;
         if (TextUtils.isEmpty(url)) return url;
-        return nativeGetDistillerViewUrlFromUrl(scheme, url);
+        return DomDistillerUrlUtilsJni.get().getDistillerViewUrlFromUrl(scheme, url);
     }
 
     /**
@@ -39,7 +40,7 @@
      */
     public static String getOriginalUrlFromDistillerUrl(String url) {
         if (TextUtils.isEmpty(url)) return url;
-        return nativeGetOriginalUrlFromDistillerUrl(url);
+        return DomDistillerUrlUtilsJni.get().getOriginalUrlFromDistillerUrl(url);
     }
 
     /**
@@ -50,17 +51,20 @@
      */
     public static boolean isDistilledPage(String url) {
         if (TextUtils.isEmpty(url)) return false;
-        return nativeIsDistilledPage(url);
+        return DomDistillerUrlUtilsJni.get().isDistilledPage(url);
     }
 
     public static String getValueForKeyInUrl(String url, String key) {
         assert key != null;
         if (TextUtils.isEmpty(url)) return null;
-        return nativeGetValueForKeyInUrl(url, key);
+        return DomDistillerUrlUtilsJni.get().getValueForKeyInUrl(url, key);
     }
 
-    private static native String nativeGetDistillerViewUrlFromUrl(String scheme, String url);
-    private static native String nativeGetOriginalUrlFromDistillerUrl(String viewerUrl);
-    private static native boolean nativeIsDistilledPage(String url);
-    private static native String nativeGetValueForKeyInUrl(String url, String key);
+    @NativeMethods
+    interface Natives {
+        String getDistillerViewUrlFromUrl(String scheme, String url);
+        String getOriginalUrlFromDistillerUrl(String viewerUrl);
+        boolean isDistilledPage(String url);
+        String getValueForKeyInUrl(String url, String key);
+    }
 }
diff --git a/components/download/internal/common/BUILD.gn b/components/download/internal/common/BUILD.gn
index 4959f0a..4c31aa2 100644
--- a/components/download/internal/common/BUILD.gn
+++ b/components/download/internal/common/BUILD.gn
@@ -105,7 +105,9 @@
 
     deps = [
       "//base:base_java",
+      "//base:jni_java",
     ]
+    annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   }
 
   generate_jni("jni_headers") {
diff --git a/components/download/internal/common/android/java/src/org/chromium/components/download/DownloadCollectionBridge.java b/components/download/internal/common/android/java/src/org/chromium/components/download/DownloadCollectionBridge.java
index e710401f..11bfaeb 100644
--- a/components/download/internal/common/android/java/src/org/chromium/components/download/DownloadCollectionBridge.java
+++ b/components/download/internal/common/android/java/src/org/chromium/components/download/DownloadCollectionBridge.java
@@ -12,6 +12,7 @@
 import org.chromium.base.Log;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 
 /**
  * Helper class for publishing download files to the public download collection.
@@ -296,7 +297,7 @@
      * @return number of days for an intermediate download to expire.
      */
     public static int getExpirationDurationInDays() {
-        return nativeGetExpirationDurationInDays();
+        return DownloadCollectionBridgeJni.get().getExpirationDurationInDays();
     }
 
     /**
@@ -309,5 +310,8 @@
         return getDownloadCollectionBridge().getDisplayNameForUri(downloadUri);
     }
 
-    private static native int nativeGetExpirationDurationInDays();
+    @NativeMethods
+    interface Natives {
+        int getExpirationDurationInDays();
+    }
 }
diff --git a/components/download/network/BUILD.gn b/components/download/network/BUILD.gn
index 9b3e61bc..99f96d6 100644
--- a/components/download/network/BUILD.gn
+++ b/components/download/network/BUILD.gn
@@ -44,8 +44,10 @@
 
     deps = [
       "//base:base_java",
+      "//base:jni_java",
       "//net/android:net_java",
     ]
+    annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   }
 
   generate_jni("jni_headers") {
diff --git a/components/download/network/android/java/src/org/chromium/components/download/NetworkStatusListenerAndroid.java b/components/download/network/android/java/src/org/chromium/components/download/NetworkStatusListenerAndroid.java
index febd8d9..aa4dbfb 100644
--- a/components/download/network/android/java/src/org/chromium/components/download/NetworkStatusListenerAndroid.java
+++ b/components/download/network/android/java/src/org/chromium/components/download/NetworkStatusListenerAndroid.java
@@ -7,6 +7,7 @@
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.net.NetworkChangeNotifierAutoDetect;
 import org.chromium.net.NetworkChangeNotifierAutoDetect.Observer;
 import org.chromium.net.RegistrationPolicyAlwaysRegister;
@@ -59,7 +60,8 @@
     @Override
     public void onConnectionTypeChanged(int newConnectionType) {
         if (mNativePtr != 0) {
-            nativeNotifyNetworkChange(mNativePtr, newConnectionType);
+            NetworkStatusListenerAndroidJni.get().notifyNetworkChange(
+                    mNativePtr, NetworkStatusListenerAndroid.this, newConnectionType);
         }
     }
 
@@ -87,6 +89,9 @@
     @Override
     public void purgeActiveNetworkList(long[] activeNetIds) {}
 
-    private native void nativeNotifyNetworkChange(
-            long nativeNetworkStatusListenerAndroid, int connectionType);
+    @NativeMethods
+    interface Natives {
+        void notifyNetworkChange(long nativeNetworkStatusListenerAndroid,
+                NetworkStatusListenerAndroid caller, int connectionType);
+    }
 }
diff --git a/components/embedder_support/android/BUILD.gn b/components/embedder_support/android/BUILD.gn
index 56a6382..ff4b9bb 100644
--- a/components/embedder_support/android/BUILD.gn
+++ b/components/embedder_support/android/BUILD.gn
@@ -42,9 +42,11 @@
 android_library("view_java") {
   deps = [
     "//base:base_java",
+    "//base:jni_java",
     "//content/public/android:content_java",
     "//ui/android:ui_java",
   ]
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   java_files = [ "java/src/org/chromium/components/embedder_support/view/ContentViewRenderView.java" ]
 }
 
@@ -147,10 +149,12 @@
   deps = [
     ":web_contents_delegate_java_resources",
     "//base:base_java",
+    "//base:jni_java",
     "//content/public/android:content_java",
     "//third_party/android_deps:com_android_support_support_compat_java",
     "//ui/android:ui_java",
   ]
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   java_files = [
     "java/src/org/chromium/components/embedder_support/delegate/ColorChooserAndroid.java",
     "java/src/org/chromium/components/embedder_support/delegate/ColorPickerAdvanced.java",
diff --git a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/ColorChooserAndroid.java b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/ColorChooserAndroid.java
index f36d348..8173794f 100644
--- a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/ColorChooserAndroid.java
+++ b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/ColorChooserAndroid.java
@@ -9,6 +9,7 @@
 import org.chromium.base.ContextUtils;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.ui.base.WindowAndroid;
 
 /**
@@ -26,7 +27,8 @@
             @Override
             public void onColorChanged(int color) {
                 mDialog.dismiss();
-                nativeOnColorChosen(mNativeColorChooserAndroid, color);
+                ColorChooserAndroidJni.get().onColorChosen(
+                        mNativeColorChooserAndroid, ColorChooserAndroid.this, color);
             }
         };
 
@@ -72,6 +74,9 @@
         array[index] = new ColorSuggestion(color, label);
     }
 
-    // Implemented in color_chooser_android.cc
-    private native void nativeOnColorChosen(long nativeColorChooserAndroid, int color);
+    @NativeMethods
+    interface Natives {
+        // Implemented in color_chooser_android.cc
+        void onColorChosen(long nativeColorChooserAndroid, ColorChooserAndroid caller, int color);
+    }
 }
diff --git a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/view/ContentViewRenderView.java b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/view/ContentViewRenderView.java
index 3ab1a247..50863566 100644
--- a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/view/ContentViewRenderView.java
+++ b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/view/ContentViewRenderView.java
@@ -15,6 +15,7 @@
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.base.WindowAndroid;
 
@@ -66,25 +67,28 @@
         assert !mSurfaceView.getHolder().getSurface().isValid()
             : "Surface created before native library loaded.";
         assert rootWindow != null;
-        mNativeContentViewRenderView = nativeInit(rootWindow);
+        mNativeContentViewRenderView =
+                ContentViewRenderViewJni.get().init(ContentViewRenderView.this, rootWindow);
         assert mNativeContentViewRenderView != 0;
         mWindowAndroid = rootWindow;
         mSurfaceCallback = new SurfaceHolder.Callback() {
             @Override
             public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                 assert mNativeContentViewRenderView != 0;
-                nativeSurfaceChanged(
-                        mNativeContentViewRenderView, format, width, height, holder.getSurface());
+                ContentViewRenderViewJni.get().surfaceChanged(mNativeContentViewRenderView,
+                        ContentViewRenderView.this, format, width, height, holder.getSurface());
                 if (mWebContents != null) {
-                    nativeOnPhysicalBackingSizeChanged(
-                            mNativeContentViewRenderView, mWebContents, width, height);
+                    ContentViewRenderViewJni.get().onPhysicalBackingSizeChanged(
+                            mNativeContentViewRenderView, ContentViewRenderView.this, mWebContents,
+                            width, height);
                 }
             }
 
             @Override
             public void surfaceCreated(SurfaceHolder holder) {
                 assert mNativeContentViewRenderView != 0;
-                nativeSurfaceCreated(mNativeContentViewRenderView);
+                ContentViewRenderViewJni.get().surfaceCreated(
+                        mNativeContentViewRenderView, ContentViewRenderView.this);
 
                 // On pre-M Android, layers start in the hidden state until a relayout happens.
                 // There is a bug that manifests itself when entering overlay mode on pre-M devices,
@@ -99,7 +103,8 @@
             @Override
             public void surfaceDestroyed(SurfaceHolder holder) {
                 assert mNativeContentViewRenderView != 0;
-                nativeSurfaceDestroyed(mNativeContentViewRenderView);
+                ContentViewRenderViewJni.get().surfaceDestroyed(
+                        mNativeContentViewRenderView, ContentViewRenderView.this);
             }
         };
         mSurfaceView.getHolder().addCallback(mSurfaceCallback);
@@ -155,7 +160,8 @@
     public void destroy() {
         mSurfaceView.getHolder().removeCallback(mSurfaceCallback);
         mWindowAndroid = null;
-        nativeDestroy(mNativeContentViewRenderView);
+        ContentViewRenderViewJni.get().destroy(
+                mNativeContentViewRenderView, ContentViewRenderView.this);
         mNativeContentViewRenderView = 0;
     }
 
@@ -165,10 +171,12 @@
 
         if (webContents != null) {
             webContents.setSize(mWidth, mHeight);
-            nativeOnPhysicalBackingSizeChanged(
-                    mNativeContentViewRenderView, webContents, mWidth, mHeight);
+            ContentViewRenderViewJni.get().onPhysicalBackingSizeChanged(
+                    mNativeContentViewRenderView, ContentViewRenderView.this, webContents, mWidth,
+                    mHeight);
         }
-        nativeSetCurrentWebContents(mNativeContentViewRenderView, webContents);
+        ContentViewRenderViewJni.get().setCurrentWebContents(
+                mNativeContentViewRenderView, ContentViewRenderView.this, webContents);
     }
 
     /**
@@ -201,7 +209,8 @@
     public void setOverlayVideoMode(boolean enabled) {
         int format = enabled ? PixelFormat.TRANSLUCENT : PixelFormat.OPAQUE;
         mSurfaceView.getHolder().setFormat(format);
-        nativeSetOverlayVideoMode(mNativeContentViewRenderView, enabled);
+        ContentViewRenderViewJni.get().setOverlayVideoMode(
+                mNativeContentViewRenderView, ContentViewRenderView.this, enabled);
     }
 
     @CalledByNative
@@ -216,16 +225,19 @@
         }
     }
 
-    private native long nativeInit(WindowAndroid rootWindow);
-    private native void nativeDestroy(long nativeContentViewRenderView);
-    private native void nativeSetCurrentWebContents(
-            long nativeContentViewRenderView, WebContents webContents);
-    private native void nativeOnPhysicalBackingSizeChanged(
-            long nativeContentViewRenderView, WebContents webContents, int width, int height);
-    private native void nativeSurfaceCreated(long nativeContentViewRenderView);
-    private native void nativeSurfaceDestroyed(long nativeContentViewRenderView);
-    private native void nativeSurfaceChanged(
-            long nativeContentViewRenderView, int format, int width, int height, Surface surface);
-    private native void nativeSetOverlayVideoMode(
-            long nativeContentViewRenderView, boolean enabled);
+    @NativeMethods
+    interface Natives {
+        long init(ContentViewRenderView caller, WindowAndroid rootWindow);
+        void destroy(long nativeContentViewRenderView, ContentViewRenderView caller);
+        void setCurrentWebContents(long nativeContentViewRenderView, ContentViewRenderView caller,
+                WebContents webContents);
+        void onPhysicalBackingSizeChanged(long nativeContentViewRenderView,
+                ContentViewRenderView caller, WebContents webContents, int width, int height);
+        void surfaceCreated(long nativeContentViewRenderView, ContentViewRenderView caller);
+        void surfaceDestroyed(long nativeContentViewRenderView, ContentViewRenderView caller);
+        void surfaceChanged(long nativeContentViewRenderView, ContentViewRenderView caller,
+                int format, int width, int height, Surface surface);
+        void setOverlayVideoMode(
+                long nativeContentViewRenderView, ContentViewRenderView caller, boolean enabled);
+    }
 }
diff --git a/components/feature_engagement/internal/BUILD.gn b/components/feature_engagement/internal/BUILD.gn
index ea5de38..b745d7d 100644
--- a/components/feature_engagement/internal/BUILD.gn
+++ b/components/feature_engagement/internal/BUILD.gn
@@ -137,10 +137,12 @@
 
     deps = [
       "//base:base_java",
+      "//base:jni_java",
       "//components/feature_engagement/public:public_java",
       "//third_party/android_deps:androidx_annotation_annotation_java",
       "//ui/android:ui_java",
     ]
+    annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   }
 
   generate_jni("jni_headers") {
diff --git a/components/feature_engagement/internal/android/java/src/org/chromium/components/feature_engagement/internal/TrackerImpl.java b/components/feature_engagement/internal/android/java/src/org/chromium/components/feature_engagement/internal/TrackerImpl.java
index e03d2ae0..956f158 100644
--- a/components/feature_engagement/internal/android/java/src/org/chromium/components/feature_engagement/internal/TrackerImpl.java
+++ b/components/feature_engagement/internal/android/java/src/org/chromium/components/feature_engagement/internal/TrackerImpl.java
@@ -11,6 +11,7 @@
 import org.chromium.base.CommandLine;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.components.feature_engagement.Tracker;
 import org.chromium.components.feature_engagement.TriggerState;
 import org.chromium.ui.UiSwitches;
@@ -25,7 +26,7 @@
      * A JNI-wrapper for the native DisplayLockHandle.
      * The C++ counterpart is DisplayLockHandleAndroid.
      */
-    private static class DisplayLockHandleAndroid implements DisplayLockHandle {
+    static class DisplayLockHandleAndroid implements DisplayLockHandle {
         @CalledByNative("DisplayLockHandleAndroid")
         private static DisplayLockHandleAndroid create(long nativePtr) {
             return new DisplayLockHandleAndroid(nativePtr);
@@ -45,7 +46,7 @@
         @Override
         public void release() {
             assert mNativePtr != 0;
-            nativeRelease(mNativePtr);
+            TrackerImplJni.get().release(mNativePtr);
             assert mNativePtr == 0;
         }
     }
@@ -67,7 +68,7 @@
     @Override
     public void notifyEvent(String event) {
         assert mNativePtr != 0;
-        nativeNotifyEvent(mNativePtr, event);
+        TrackerImplJni.get().notifyEvent(mNativePtr, TrackerImpl.this, event);
     }
 
     @Override
@@ -78,26 +79,26 @@
         }
 
         assert mNativePtr != 0;
-        return nativeShouldTriggerHelpUI(mNativePtr, feature);
+        return TrackerImplJni.get().shouldTriggerHelpUI(mNativePtr, TrackerImpl.this, feature);
     }
 
     @Override
     public boolean wouldTriggerHelpUI(String feature) {
         assert mNativePtr != 0;
-        return nativeWouldTriggerHelpUI(mNativePtr, feature);
+        return TrackerImplJni.get().wouldTriggerHelpUI(mNativePtr, TrackerImpl.this, feature);
     }
 
     @Override
     @TriggerState
     public int getTriggerState(String feature) {
         assert mNativePtr != 0;
-        return nativeGetTriggerState(mNativePtr, feature);
+        return TrackerImplJni.get().getTriggerState(mNativePtr, TrackerImpl.this, feature);
     }
 
     @Override
     public void dismissed(String feature) {
         assert mNativePtr != 0;
-        nativeDismissed(mNativePtr, feature);
+        TrackerImplJni.get().dismissed(mNativePtr, TrackerImpl.this, feature);
     }
 
     @Override
@@ -105,19 +106,19 @@
     @Nullable
     public DisplayLockHandle acquireDisplayLock() {
         assert mNativePtr != 0;
-        return nativeAcquireDisplayLock(mNativePtr);
+        return TrackerImplJni.get().acquireDisplayLock(mNativePtr, TrackerImpl.this);
     }
 
     @Override
     public boolean isInitialized() {
         assert mNativePtr != 0;
-        return nativeIsInitialized(mNativePtr);
+        return TrackerImplJni.get().isInitialized(mNativePtr, TrackerImpl.this);
     }
 
     @Override
     public void addOnInitializedCallback(Callback<Boolean> callback) {
         assert mNativePtr != 0;
-        nativeAddOnInitializedCallback(mNativePtr, callback);
+        TrackerImplJni.get().addOnInitializedCallback(mNativePtr, TrackerImpl.this, callback);
     }
 
     @CalledByNative
@@ -131,15 +132,20 @@
         return mNativePtr;
     }
 
-    private native void nativeNotifyEvent(long nativeTrackerImplAndroid, String event);
-    private native boolean nativeShouldTriggerHelpUI(long nativeTrackerImplAndroid, String feature);
-    private native boolean nativeWouldTriggerHelpUI(long nativeTrackerImplAndroid, String feature);
-    @TriggerState
-    private native int nativeGetTriggerState(long nativeTrackerImplAndroid, String feature);
-    private native void nativeDismissed(long nativeTrackerImplAndroid, String feature);
-    private native DisplayLockHandleAndroid nativeAcquireDisplayLock(long nativeTrackerImplAndroid);
-    private native boolean nativeIsInitialized(long nativeTrackerImplAndroid);
-    private native void nativeAddOnInitializedCallback(
-            long nativeTrackerImplAndroid, Callback<Boolean> callback);
-    private static native void nativeRelease(long nativeDisplayLockHandleAndroid);
+    @NativeMethods
+    interface Natives {
+        void notifyEvent(long nativeTrackerImplAndroid, TrackerImpl caller, String event);
+        boolean shouldTriggerHelpUI(
+                long nativeTrackerImplAndroid, TrackerImpl caller, String feature);
+        boolean wouldTriggerHelpUI(
+                long nativeTrackerImplAndroid, TrackerImpl caller, String feature);
+        int getTriggerState(long nativeTrackerImplAndroid, TrackerImpl caller, String feature);
+        void dismissed(long nativeTrackerImplAndroid, TrackerImpl caller, String feature);
+        DisplayLockHandleAndroid acquireDisplayLock(
+                long nativeTrackerImplAndroid, TrackerImpl caller);
+        boolean isInitialized(long nativeTrackerImplAndroid, TrackerImpl caller);
+        void addOnInitializedCallback(
+                long nativeTrackerImplAndroid, TrackerImpl caller, Callback<Boolean> callback);
+        void release(long nativeDisplayLockHandleAndroid);
+    }
 }
diff --git a/components/gcm_driver/android/BUILD.gn b/components/gcm_driver/android/BUILD.gn
index ec731b371..42a6911b 100644
--- a/components/gcm_driver/android/BUILD.gn
+++ b/components/gcm_driver/android/BUILD.gn
@@ -13,10 +13,12 @@
 android_library("gcm_driver_java") {
   deps = [
     "//base:base_java",
+    "//base:jni_java",
     "//content/public/android:content_java",
     "//third_party/android_sdk:android_gcm_java",
     "//third_party/jsr-305:jsr_305_javalib",
   ]
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
 
   java_files = [
     "java/src/org/chromium/components/gcm_driver/GCMDriver.java",
diff --git a/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMDriver.java b/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMDriver.java
index 602fdd3..5c53f0f 100644
--- a/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMDriver.java
+++ b/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMDriver.java
@@ -11,6 +11,7 @@
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.task.AsyncTask;
 import org.chromium.base.task.PostTask;
@@ -112,8 +113,8 @@
             }
             @Override
             protected void onPostExecute(String registrationId) {
-                nativeOnRegisterFinished(mNativeGCMDriverAndroid, appId, registrationId,
-                                         !registrationId.isEmpty());
+                GCMDriverJni.get().onRegisterFinished(mNativeGCMDriverAndroid, GCMDriver.this,
+                        appId, registrationId, !registrationId.isEmpty());
             }
         }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
     }
@@ -135,7 +136,8 @@
 
             @Override
             protected void onPostExecute(Boolean success) {
-                nativeOnUnregisterFinished(mNativeGCMDriverAndroid, appId, success);
+                GCMDriverJni.get().onUnregisterFinished(
+                        mNativeGCMDriverAndroid, GCMDriver.this, appId, success);
             }
         }
                 .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
@@ -149,9 +151,10 @@
             throw new RuntimeException("Failed to instantiate GCMDriver.");
         }
 
-        sInstance.nativeOnMessageReceived(sInstance.mNativeGCMDriverAndroid, message.getAppId(),
-                message.getSenderId(), message.getMessageId(), message.getCollapseKey(),
-                message.getRawData(), message.getDataKeysAndValuesArray());
+        GCMDriverJni.get().onMessageReceived(sInstance.mNativeGCMDriverAndroid, sInstance,
+                message.getAppId(), message.getSenderId(), message.getMessageId(),
+                message.getCollapseKey(), message.getRawData(),
+                message.getDataKeysAndValuesArray());
     }
 
     @VisibleForTesting
@@ -161,11 +164,14 @@
         sInstance.mSubscriber = subscriber;
     }
 
-    private native void nativeOnRegisterFinished(long nativeGCMDriverAndroid, String appId,
-            String registrationId, boolean success);
-    private native void nativeOnUnregisterFinished(long nativeGCMDriverAndroid, String appId,
-            boolean success);
-    private native void nativeOnMessageReceived(long nativeGCMDriverAndroid, String appId,
-            String senderId, String messageId, String collapseKey, byte[] rawData,
-            String[] dataKeysAndValues);
+    @NativeMethods
+    interface Natives {
+        void onRegisterFinished(long nativeGCMDriverAndroid, GCMDriver caller, String appId,
+                String registrationId, boolean success);
+        void onUnregisterFinished(
+                long nativeGCMDriverAndroid, GCMDriver caller, String appId, boolean success);
+        void onMessageReceived(long nativeGCMDriverAndroid, GCMDriver caller, String appId,
+                String senderId, String messageId, String collapseKey, byte[] rawData,
+                String[] dataKeysAndValues);
+    }
 }
diff --git a/components/gcm_driver/instance_id/android/BUILD.gn b/components/gcm_driver/instance_id/android/BUILD.gn
index a0e0775..1d9ee84 100644
--- a/components/gcm_driver/instance_id/android/BUILD.gn
+++ b/components/gcm_driver/instance_id/android/BUILD.gn
@@ -20,8 +20,10 @@
   deps = [
     "$google_play_services_package:google_play_services_iid_java",
     "//base:base_java",
+    "//base:jni_java",
     "//components/gcm_driver/android:gcm_driver_java",
   ]
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
 
   srcjar_deps =
       [ "//components/gcm_driver/instance_id:instance_id_java_enums_srcjar" ]
diff --git a/components/gcm_driver/instance_id/android/java/src/org/chromium/components/gcm_driver/instance_id/InstanceIDBridge.java b/components/gcm_driver/instance_id/android/java/src/org/chromium/components/gcm_driver/instance_id/InstanceIDBridge.java
index 8e06aaf..a9a2c2a6 100644
--- a/components/gcm_driver/instance_id/android/java/src/org/chromium/components/gcm_driver/instance_id/InstanceIDBridge.java
+++ b/components/gcm_driver/instance_id/android/java/src/org/chromium/components/gcm_driver/instance_id/InstanceIDBridge.java
@@ -8,6 +8,7 @@
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.task.AsyncTask;
 import org.chromium.components.gcm_driver.InstanceIDFlags;
 import org.chromium.components.gcm_driver.LazySubscriptionsManager;
@@ -77,7 +78,8 @@
             }
             @Override
             protected void sendResultToNative(String id) {
-                nativeDidGetID(mNativeInstanceIDAndroid, requestId, id);
+                InstanceIDBridgeJni.get().didGetID(
+                        mNativeInstanceIDAndroid, InstanceIDBridge.this, requestId, id);
             }
         }.execute();
     }
@@ -92,7 +94,8 @@
             }
             @Override
             protected void sendResultToNative(Long creationTime) {
-                nativeDidGetCreationTime(mNativeInstanceIDAndroid, requestId, creationTime);
+                InstanceIDBridgeJni.get().didGetCreationTime(
+                        mNativeInstanceIDAndroid, InstanceIDBridge.this, requestId, creationTime);
             }
         }.execute();
     }
@@ -131,7 +134,8 @@
             }
             @Override
             protected void sendResultToNative(String token) {
-                nativeDidGetToken(mNativeInstanceIDAndroid, requestId, token);
+                InstanceIDBridgeJni.get().didGetToken(
+                        mNativeInstanceIDAndroid, InstanceIDBridge.this, requestId, token);
             }
         }.execute();
     }
@@ -161,7 +165,8 @@
             }
             @Override
             protected void sendResultToNative(Boolean success) {
-                nativeDidDeleteToken(mNativeInstanceIDAndroid, requestId, success);
+                InstanceIDBridgeJni.get().didDeleteToken(
+                        mNativeInstanceIDAndroid, InstanceIDBridge.this, requestId, success);
             }
         }.execute();
     }
@@ -181,21 +186,12 @@
             }
             @Override
             protected void sendResultToNative(Boolean success) {
-                nativeDidDeleteID(mNativeInstanceIDAndroid, requestId, success);
+                InstanceIDBridgeJni.get().didDeleteID(
+                        mNativeInstanceIDAndroid, InstanceIDBridge.this, requestId, success);
             }
         }.execute();
     }
 
-    private native void nativeDidGetID(long nativeInstanceIDAndroid, int requestId, String id);
-    private native void nativeDidGetCreationTime(
-            long nativeInstanceIDAndroid, int requestId, long creationTime);
-    private native void nativeDidGetToken(
-            long nativeInstanceIDAndroid, int requestId, String token);
-    private native void nativeDidDeleteToken(
-            long nativeInstanceIDAndroid, int requestId, boolean success);
-    private native void nativeDidDeleteID(
-            long nativeInstanceIDAndroid, int requestId, boolean success);
-
     /**
      * Custom {@link AsyncTask} wrapper. As usual, this performs work on a background thread, then
      * sends the result back on the UI thread. Key differences:
@@ -243,4 +239,18 @@
             }
         }
     }
+
+    @NativeMethods
+    interface Natives {
+        void didGetID(
+                long nativeInstanceIDAndroid, InstanceIDBridge caller, int requestId, String id);
+        void didGetCreationTime(long nativeInstanceIDAndroid, InstanceIDBridge caller,
+                int requestId, long creationTime);
+        void didGetToken(
+                long nativeInstanceIDAndroid, InstanceIDBridge caller, int requestId, String token);
+        void didDeleteToken(long nativeInstanceIDAndroid, InstanceIDBridge caller, int requestId,
+                boolean success);
+        void didDeleteID(long nativeInstanceIDAndroid, InstanceIDBridge caller, int requestId,
+                boolean success);
+    }
 }
diff --git a/components/invalidation/impl/BUILD.gn b/components/invalidation/impl/BUILD.gn
index 67ab71f8..cbdb2f6 100644
--- a/components/invalidation/impl/BUILD.gn
+++ b/components/invalidation/impl/BUILD.gn
@@ -238,6 +238,7 @@
     deps = [
       ":proto_java",
       "//base:base_java",
+      "//base:jni_java",
       "//components/signin/core/browser/android:java",
       "//components/sync/android:sync_java",
       "//third_party/android_deps:com_google_protobuf_protobuf_lite_java",
@@ -245,6 +246,7 @@
       "//third_party/cacheinvalidation:cacheinvalidation_proto_java",
       "//third_party/jsr-305:jsr_305_javalib",
     ]
+    annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
     java_files = [
       "android/java/src/org/chromium/components/invalidation/InvalidationClientService.java",
       "android/java/src/org/chromium/components/invalidation/InvalidationService.java",
diff --git a/components/invalidation/impl/android/java/src/org/chromium/components/invalidation/InvalidationService.java b/components/invalidation/impl/android/java/src/org/chromium/components/invalidation/InvalidationService.java
index b0f373a1..29f107a 100644
--- a/components/invalidation/impl/android/java/src/org/chromium/components/invalidation/InvalidationService.java
+++ b/components/invalidation/impl/android/java/src/org/chromium/components/invalidation/InvalidationService.java
@@ -16,6 +16,7 @@
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.components.sync.notifier.InvalidationClientNameProvider;
 import org.chromium.components.sync.notifier.InvalidationIntentProtocol;
 import org.chromium.components.sync.notifier.InvalidationPreferences;
@@ -38,8 +39,8 @@
     public void notifyInvalidationToNativeChrome(
             int objectSource, String objectId, long version, String payload) {
         ThreadUtils.assertOnUiThread();
-        nativeInvalidate(
-                mNativeInvalidationServiceAndroid, objectSource, objectId, version, payload);
+        InvalidationServiceJni.get().invalidate(mNativeInvalidationServiceAndroid,
+                InvalidationService.this, objectSource, objectId, version, payload);
     }
 
     public void requestSyncFromNativeChromeForAllTypes() {
@@ -97,6 +98,9 @@
         return InvalidationClientNameProvider.get().getInvalidatorClientName();
     }
 
-    private native void nativeInvalidate(long nativeInvalidationServiceAndroid, int objectSource,
-            String objectId, long version, String payload);
+    @NativeMethods
+    interface Natives {
+        void invalidate(long nativeInvalidationServiceAndroid, InvalidationService caller,
+                int objectSource, String objectId, long version, String payload);
+    }
 }
diff --git a/components/language/android/BUILD.gn b/components/language/android/BUILD.gn
index 40ccf58..5cf1402a 100644
--- a/components/language/android/BUILD.gn
+++ b/components/language/android/BUILD.gn
@@ -32,5 +32,7 @@
 
   deps = [
     "//base:base_java",
+    "//base:jni_java",
   ]
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
 }
diff --git a/components/language/android/java/src/org/chromium/components/language/AndroidLanguageMetricsBridge.java b/components/language/android/java/src/org/chromium/components/language/AndroidLanguageMetricsBridge.java
index da83a63..6f1da6b 100644
--- a/components/language/android/java/src/org/chromium/components/language/AndroidLanguageMetricsBridge.java
+++ b/components/language/android/java/src/org/chromium/components/language/AndroidLanguageMetricsBridge.java
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 package org.chromium.components.language;
+import org.chromium.base.annotations.NativeMethods;
 
 /**
  * A bridge to language metrics functions that require access to native code.
@@ -15,9 +16,12 @@
      * @param added True if the language was added, false if it was removed.
      */
     public static void reportExplicitLanguageAskStateChanged(String language, boolean added) {
-        nativeReportExplicitLanguageAskStateChanged(language, added);
+        AndroidLanguageMetricsBridgeJni.get().reportExplicitLanguageAskStateChanged(
+                language, added);
     }
 
-    private static native void nativeReportExplicitLanguageAskStateChanged(
-            String language, boolean added);
+    @NativeMethods
+    interface Natives {
+        void reportExplicitLanguageAskStateChanged(String language, boolean added);
+    }
 }
diff --git a/components/language/android/java/src/org/chromium/components/language/GeoLanguageProviderBridge.java b/components/language/android/java/src/org/chromium/components/language/GeoLanguageProviderBridge.java
index 7a91bd4..6682e76 100644
--- a/components/language/android/java/src/org/chromium/components/language/GeoLanguageProviderBridge.java
+++ b/components/language/android/java/src/org/chromium/components/language/GeoLanguageProviderBridge.java
@@ -5,6 +5,7 @@
 package org.chromium.components.language;
 
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 
 import java.util.LinkedHashSet;
 
@@ -19,7 +20,7 @@
      */
     public static LinkedHashSet<String> getCurrentGeoLanguages() {
         LinkedHashSet<String> set = new LinkedHashSet<String>();
-        nativeGetCurrentGeoLanguages(set);
+        GeoLanguageProviderBridgeJni.get().getCurrentGeoLanguages(set);
         return set;
     }
 
@@ -28,5 +29,8 @@
         languages.add(languageCode);
     }
 
-    private static native void nativeGetCurrentGeoLanguages(LinkedHashSet<String> set);
+    @NativeMethods
+    interface Natives {
+        void getCurrentGeoLanguages(LinkedHashSet<String> set);
+    }
 }
diff --git a/components/minidump_uploader/BUILD.gn b/components/minidump_uploader/BUILD.gn
index 9574123..1f0631c 100644
--- a/components/minidump_uploader/BUILD.gn
+++ b/components/minidump_uploader/BUILD.gn
@@ -29,6 +29,7 @@
 android_library("minidump_uploader_java") {
   deps = [
     "//base:base_java",
+    "//base:jni_java",
     "//third_party/android_deps:androidx_annotation_annotation_java",
   ]
 
@@ -45,6 +46,7 @@
     "android/java/src/org/chromium/components/minidump_uploader/util/HttpURLConnectionFactoryImpl.java",
     "android/java/src/org/chromium/components/minidump_uploader/util/NetworkPermissionUtil.java",
   ]
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
 }
 
 android_library("minidump_uploader_javatests") {
diff --git a/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/CrashReportMimeWriter.java b/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/CrashReportMimeWriter.java
index dec66fa..a3f2c5cf3 100644
--- a/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/CrashReportMimeWriter.java
+++ b/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/CrashReportMimeWriter.java
@@ -5,6 +5,7 @@
 package org.chromium.components.minidump_uploader;
 
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 
 import java.io.File;
 import java.util.HashMap;
@@ -27,7 +28,8 @@
      * @param destDir The directory in which to write the MIME files.
      */
     public static void rewriteMinidumpsAsMIMEs(File srcDir, File destDir) {
-        nativeRewriteMinidumpsAsMIMEs(srcDir.getAbsolutePath(), destDir.getAbsolutePath());
+        CrashReportMimeWriterJni.get().rewriteMinidumpsAsMIMEs(
+                srcDir.getAbsolutePath(), destDir.getAbsolutePath());
     }
 
     /*
@@ -41,8 +43,9 @@
      */
     public static Map<String, Map<String, String>> rewriteMinidumpsAsMIMEsAndGetCrashKeys(
             File srcDir, File destDir) {
-        String[] crashesKeyValueArr = nativeRewriteMinidumpsAsMIMEsAndGetCrashKeys(
-                srcDir.getAbsolutePath(), destDir.getAbsolutePath());
+        String[] crashesKeyValueArr =
+                CrashReportMimeWriterJni.get().rewriteMinidumpsAsMIMEsAndGetCrashKeys(
+                        srcDir.getAbsolutePath(), destDir.getAbsolutePath());
         Map<String, Map<String, String>> crashesInfoMap = new HashMap<>();
         Map<String, String> lastCrashInfo = new HashMap<>();
         // Keys and values for all crash files are flattened in a String array. Each key is followed
@@ -65,7 +68,9 @@
         return crashesInfoMap;
     }
 
-    private static native void nativeRewriteMinidumpsAsMIMEs(String srcDir, String destDir);
-    private static native String[] nativeRewriteMinidumpsAsMIMEsAndGetCrashKeys(
-            String srcDir, String destDir);
+    @NativeMethods
+    interface Natives {
+        void rewriteMinidumpsAsMIMEs(String srcDir, String destDir);
+        String[] rewriteMinidumpsAsMIMEsAndGetCrashKeys(String srcDir, String destDir);
+    }
 }
diff --git a/components/offline_items_collection/core/BUILD.gn b/components/offline_items_collection/core/BUILD.gn
index 1350737..7c9e910 100644
--- a/components/offline_items_collection/core/BUILD.gn
+++ b/components/offline_items_collection/core/BUILD.gn
@@ -91,11 +91,13 @@
       "android/java/src/org/chromium/components/offline_items_collection/UpdateDelta.java",
       "android/java/src/org/chromium/components/offline_items_collection/VisualsCallback.java",
     ]
+    annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
 
     srcjar_deps = [ ":jni_enums" ]
 
     deps = [
       "//base:base_java",
+      "//base:jni_java",
       "//third_party/android_deps:androidx_annotation_annotation_java",
     ]
   }
diff --git a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java
index a7af8bd..8f34c717 100644
--- a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java
+++ b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java
@@ -10,6 +10,7 @@
 import org.chromium.base.ObserverList;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 
 import java.util.ArrayList;
 
@@ -40,62 +41,72 @@
     @Override
     public void openItem(@LaunchLocation int location, ContentId id) {
         if (mNativeOfflineContentAggregatorBridge == 0) return;
-        nativeOpenItem(mNativeOfflineContentAggregatorBridge, location, id.namespace, id.id);
+        OfflineContentAggregatorBridgeJni.get().openItem(mNativeOfflineContentAggregatorBridge,
+                OfflineContentAggregatorBridge.this, location, id.namespace, id.id);
     }
 
     @Override
     public void removeItem(ContentId id) {
         if (mNativeOfflineContentAggregatorBridge == 0) return;
-        nativeRemoveItem(mNativeOfflineContentAggregatorBridge, id.namespace, id.id);
+        OfflineContentAggregatorBridgeJni.get().removeItem(mNativeOfflineContentAggregatorBridge,
+                OfflineContentAggregatorBridge.this, id.namespace, id.id);
     }
 
     @Override
     public void cancelDownload(ContentId id) {
         if (mNativeOfflineContentAggregatorBridge == 0) return;
-        nativeCancelDownload(mNativeOfflineContentAggregatorBridge, id.namespace, id.id);
+        OfflineContentAggregatorBridgeJni.get().cancelDownload(
+                mNativeOfflineContentAggregatorBridge, OfflineContentAggregatorBridge.this,
+                id.namespace, id.id);
     }
 
     @Override
     public void pauseDownload(ContentId id) {
         if (mNativeOfflineContentAggregatorBridge == 0) return;
-        nativePauseDownload(mNativeOfflineContentAggregatorBridge, id.namespace, id.id);
+        OfflineContentAggregatorBridgeJni.get().pauseDownload(mNativeOfflineContentAggregatorBridge,
+                OfflineContentAggregatorBridge.this, id.namespace, id.id);
     }
 
     @Override
     public void resumeDownload(ContentId id, boolean hasUserGesture) {
         if (mNativeOfflineContentAggregatorBridge == 0) return;
-        nativeResumeDownload(
-                mNativeOfflineContentAggregatorBridge, id.namespace, id.id, hasUserGesture);
+        OfflineContentAggregatorBridgeJni.get().resumeDownload(
+                mNativeOfflineContentAggregatorBridge, OfflineContentAggregatorBridge.this,
+                id.namespace, id.id, hasUserGesture);
     }
 
     @Override
     public void getItemById(ContentId id, Callback<OfflineItem> callback) {
         if (mNativeOfflineContentAggregatorBridge == 0) return;
-        nativeGetItemById(mNativeOfflineContentAggregatorBridge, id.namespace, id.id, callback);
+        OfflineContentAggregatorBridgeJni.get().getItemById(mNativeOfflineContentAggregatorBridge,
+                OfflineContentAggregatorBridge.this, id.namespace, id.id, callback);
     }
 
     @Override
     public void getAllItems(Callback<ArrayList<OfflineItem>> callback) {
         if (mNativeOfflineContentAggregatorBridge == 0) return;
-        nativeGetAllItems(mNativeOfflineContentAggregatorBridge, callback);
+        OfflineContentAggregatorBridgeJni.get().getAllItems(mNativeOfflineContentAggregatorBridge,
+                OfflineContentAggregatorBridge.this, callback);
     }
 
     @Override
     public void getVisualsForItem(ContentId id, VisualsCallback callback) {
-        nativeGetVisualsForItem(
-                mNativeOfflineContentAggregatorBridge, id.namespace, id.id, callback);
+        OfflineContentAggregatorBridgeJni.get().getVisualsForItem(
+                mNativeOfflineContentAggregatorBridge, OfflineContentAggregatorBridge.this,
+                id.namespace, id.id, callback);
     }
 
     @Override
     public void getShareInfoForItem(ContentId id, ShareCallback callback) {
-        nativeGetShareInfoForItem(
-                mNativeOfflineContentAggregatorBridge, id.namespace, id.id, callback);
+        OfflineContentAggregatorBridgeJni.get().getShareInfoForItem(
+                mNativeOfflineContentAggregatorBridge, OfflineContentAggregatorBridge.this,
+                id.namespace, id.id, callback);
     }
 
     @Override
     public void renameItem(ContentId id, String name, Callback</*RenameResult*/ Integer> callback) {
-        nativeRenameItem(
-                mNativeOfflineContentAggregatorBridge, id.namespace, id.id, name, callback);
+        OfflineContentAggregatorBridgeJni.get().renameItem(mNativeOfflineContentAggregatorBridge,
+                OfflineContentAggregatorBridge.this, id.namespace, id.id, name, callback);
     }
 
     @Override
@@ -168,25 +179,34 @@
         return new OfflineContentAggregatorBridge(nativeOfflineContentAggregatorBridge);
     }
 
-    // Methods called to C++ via JNI.
-    private native void nativeOpenItem(long nativeOfflineContentAggregatorBridge,
-            @LaunchLocation int location, String nameSpace, String id);
-    private native void nativeRemoveItem(
-            long nativeOfflineContentAggregatorBridge, String nameSpace, String id);
-    private native void nativeCancelDownload(
-            long nativeOfflineContentAggregatorBridge, String nameSpace, String id);
-    private native void nativePauseDownload(
-            long nativeOfflineContentAggregatorBridge, String nameSpace, String id);
-    private native void nativeResumeDownload(long nativeOfflineContentAggregatorBridge,
-            String nameSpace, String id, boolean hasUserGesture);
-    private native void nativeGetItemById(long nativeOfflineContentAggregatorBridge,
-            String nameSpace, String id, Callback<OfflineItem> callback);
-    private native void nativeGetAllItems(
-            long nativeOfflineContentAggregatorBridge, Callback<ArrayList<OfflineItem>> callback);
-    private native void nativeGetVisualsForItem(long nativeOfflineContentAggregatorBridge,
-            String nameSpace, String id, VisualsCallback callback);
-    private native void nativeGetShareInfoForItem(long nativeOfflineContentAggregatorBridge,
-            String nameSpace, String id, ShareCallback callback);
-    private native void nativeRenameItem(long nativeOfflineContentAggregatorBridge,
-            String nameSpace, String id, String name, Callback</*RenameResult*/ Integer> callback);
-}
\ No newline at end of file
+    @NativeMethods
+    interface Natives {
+        void openItem(long nativeOfflineContentAggregatorBridge,
+                OfflineContentAggregatorBridge caller, @LaunchLocation int location,
+                String nameSpace, String id);
+
+        void removeItem(long nativeOfflineContentAggregatorBridge,
+                OfflineContentAggregatorBridge caller, String nameSpace, String id);
+        void cancelDownload(long nativeOfflineContentAggregatorBridge,
+                OfflineContentAggregatorBridge caller, String nameSpace, String id);
+        void pauseDownload(long nativeOfflineContentAggregatorBridge,
+                OfflineContentAggregatorBridge caller, String nameSpace, String id);
+        void resumeDownload(long nativeOfflineContentAggregatorBridge,
+                OfflineContentAggregatorBridge caller, String nameSpace, String id,
+                boolean hasUserGesture);
+        void getItemById(long nativeOfflineContentAggregatorBridge,
+                OfflineContentAggregatorBridge caller, String nameSpace, String id,
+                Callback<OfflineItem> callback);
+        void getAllItems(long nativeOfflineContentAggregatorBridge,
+                OfflineContentAggregatorBridge caller, Callback<ArrayList<OfflineItem>> callback);
+        void getVisualsForItem(long nativeOfflineContentAggregatorBridge,
+                OfflineContentAggregatorBridge caller, String nameSpace, String id,
+                VisualsCallback callback);
+        void getShareInfoForItem(long nativeOfflineContentAggregatorBridge,
+                OfflineContentAggregatorBridge caller, String nameSpace, String id,
+                ShareCallback callback);
+        void renameItem(long nativeOfflineContentAggregatorBridge,
+                OfflineContentAggregatorBridge caller, String nameSpace, String id, String name,
+                Callback</*RenameResult*/ Integer> callback);
+    }
+}
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/CurrencyFormatter.java b/components/payments/content/android/java/src/org/chromium/components/payments/CurrencyFormatter.java
index 21c32a1..779d856 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/CurrencyFormatter.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/CurrencyFormatter.java
@@ -5,6 +5,7 @@
 package org.chromium.components.payments;
 
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 
 import java.util.Locale;
 
@@ -33,21 +34,22 @@
 
         // Note that this pointer could leak the native object. The called must call destroy() to
         // ensure that the native object is destroyed.
-        mCurrencyFormatterAndroid =
-                nativeInitCurrencyFormatterAndroid(currencyCode, userLocale.toString());
+        mCurrencyFormatterAndroid = CurrencyFormatterJni.get().initCurrencyFormatterAndroid(
+                CurrencyFormatter.this, currencyCode, userLocale.toString());
     }
 
     /** Will destroy the native object. This class shouldn't be used afterwards. */
     public void destroy() {
         if (mCurrencyFormatterAndroid != 0) {
-            nativeDestroy(mCurrencyFormatterAndroid);
+            CurrencyFormatterJni.get().destroy(mCurrencyFormatterAndroid, CurrencyFormatter.this);
             mCurrencyFormatterAndroid = 0;
         }
     }
 
     /** @return The currency code formatted for display. */
     public String getFormattedCurrencyCode() {
-        return nativeGetFormattedCurrencyCode(mCurrencyFormatterAndroid);
+        return CurrencyFormatterJni.get().getFormattedCurrencyCode(
+                mCurrencyFormatterAndroid, CurrencyFormatter.this);
     }
 
     /**
@@ -63,11 +65,18 @@
     public String format(String amountValue) {
         assert amountValue != null : "amountValue should not be null";
 
-        return nativeFormat(mCurrencyFormatterAndroid, amountValue);
+        return CurrencyFormatterJni.get().format(
+                mCurrencyFormatterAndroid, CurrencyFormatter.this, amountValue);
     }
 
-    private native long nativeInitCurrencyFormatterAndroid(String currencyCode, String localeName);
-    private native void nativeDestroy(long nativeCurrencyFormatterAndroid);
-    private native String nativeFormat(long nativeCurrencyFormatterAndroid, String amountValue);
-    private native String nativeGetFormattedCurrencyCode(long nativeCurrencyFormatterAndroid);
+    @NativeMethods
+    interface Natives {
+        long initCurrencyFormatterAndroid(
+                CurrencyFormatter caller, String currencyCode, String localeName);
+        void destroy(long nativeCurrencyFormatterAndroid, CurrencyFormatter caller);
+        String format(
+                long nativeCurrencyFormatterAndroid, CurrencyFormatter caller, String amountValue);
+        String getFormattedCurrencyCode(
+                long nativeCurrencyFormatterAndroid, CurrencyFormatter caller);
+    }
 }
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/OriginSecurityChecker.java b/components/payments/content/android/java/src/org/chromium/components/payments/OriginSecurityChecker.java
index e19205c6..ea0f9bf 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/OriginSecurityChecker.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/OriginSecurityChecker.java
@@ -5,6 +5,7 @@
 package org.chromium.components.payments;
 
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 
 /** Helper for origin security. */
 @JNINamespace("payments")
@@ -17,7 +18,7 @@
      * @return Whether the origin of the URL is secure.
      */
     public static boolean isOriginSecure(String url) {
-        return nativeIsOriginSecure(url);
+        return OriginSecurityCheckerJni.get().isOriginSecure(url);
     }
 
     /**
@@ -27,11 +28,14 @@
      * @return Whether the scheme of the URL is cryptographic.
      */
     public static boolean isSchemeCryptographic(String url) {
-        return nativeIsSchemeCryptographic(url);
+        return OriginSecurityCheckerJni.get().isSchemeCryptographic(url);
     }
 
     private OriginSecurityChecker() {}
 
-    private static native boolean nativeIsOriginSecure(String url);
-    private static native boolean nativeIsSchemeCryptographic(String url);
+    @NativeMethods
+    interface Natives {
+        boolean isOriginSecure(String url);
+        boolean isSchemeCryptographic(String url);
+    }
 }
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestDownloader.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestDownloader.java
index 897167f..f53e3d46 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestDownloader.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestDownloader.java
@@ -7,6 +7,7 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.content_public.browser.WebContents;
 
 import java.net.URI;
@@ -55,7 +56,7 @@
     public void initialize(WebContents webContents) {
         ThreadUtils.assertOnUiThread();
         assert mNativeObject == 0;
-        mNativeObject = nativeInit(webContents);
+        mNativeObject = PaymentManifestDownloaderJni.get().init(webContents);
     }
 
     /** @return Whether the native downloader is initialized. */
@@ -73,7 +74,8 @@
     public void downloadPaymentMethodManifest(URI methodName, ManifestDownloadCallback callback) {
         ThreadUtils.assertOnUiThread();
         assert mNativeObject != 0;
-        nativeDownloadPaymentMethodManifest(mNativeObject, methodName, callback);
+        PaymentManifestDownloaderJni.get().downloadPaymentMethodManifest(
+                mNativeObject, PaymentManifestDownloader.this, methodName, callback);
     }
 
     /**
@@ -85,14 +87,15 @@
     public void downloadWebAppManifest(URI webAppManifestUri, ManifestDownloadCallback callback) {
         ThreadUtils.assertOnUiThread();
         assert mNativeObject != 0;
-        nativeDownloadWebAppManifest(mNativeObject, webAppManifestUri, callback);
+        PaymentManifestDownloaderJni.get().downloadWebAppManifest(
+                mNativeObject, PaymentManifestDownloader.this, webAppManifestUri, callback);
     }
 
     /** Destroys the native downloader. */
     public void destroy() {
         ThreadUtils.assertOnUiThread();
         assert mNativeObject != 0;
-        nativeDestroy(mNativeObject);
+        PaymentManifestDownloaderJni.get().destroy(mNativeObject, PaymentManifestDownloader.this);
         mNativeObject = 0;
     }
 
@@ -101,11 +104,15 @@
         return methodName.toString();
     }
 
-    private static native long nativeInit(WebContents webContents);
-    private native void nativeDownloadPaymentMethodManifest(
-            long nativePaymentManifestDownloaderAndroid, URI methodName,
-            ManifestDownloadCallback callback);
-    private native void nativeDownloadWebAppManifest(long nativePaymentManifestDownloaderAndroid,
-            URI webAppManifestUri, ManifestDownloadCallback callback);
-    private native void nativeDestroy(long nativePaymentManifestDownloaderAndroid);
+    @NativeMethods
+    interface Natives {
+        long init(WebContents webContents);
+        void downloadPaymentMethodManifest(long nativePaymentManifestDownloaderAndroid,
+                PaymentManifestDownloader caller, URI methodName,
+                ManifestDownloadCallback callback);
+        void downloadWebAppManifest(long nativePaymentManifestDownloaderAndroid,
+                PaymentManifestDownloader caller, URI webAppManifestUri,
+                ManifestDownloadCallback callback);
+        void destroy(long nativePaymentManifestDownloaderAndroid, PaymentManifestDownloader caller);
+    }
 }
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestParser.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestParser.java
index 3049846..7853fea 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestParser.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestParser.java
@@ -7,6 +7,7 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.content_public.browser.WebContents;
 
 import java.net.URI;
@@ -53,14 +54,16 @@
     public void createNative(WebContents webContents) {
         ThreadUtils.assertOnUiThread();
         assert mNativePaymentManifestParserAndroid == 0;
-        mNativePaymentManifestParserAndroid = nativeCreatePaymentManifestParserAndroid(webContents);
+        mNativePaymentManifestParserAndroid =
+                PaymentManifestParserJni.get().createPaymentManifestParserAndroid(webContents);
     }
 
     /** Releases the resources held by the native side. */
     public void destroyNative() {
         ThreadUtils.assertOnUiThread();
         assert mNativePaymentManifestParserAndroid != 0;
-        nativeDestroyPaymentManifestParserAndroid(mNativePaymentManifestParserAndroid);
+        PaymentManifestParserJni.get().destroyPaymentManifestParserAndroid(
+                mNativePaymentManifestParserAndroid);
         mNativePaymentManifestParserAndroid = 0;
     }
 
@@ -79,7 +82,8 @@
     public void parsePaymentMethodManifest(String content, ManifestParseCallback callback) {
         ThreadUtils.assertOnUiThread();
         assert mNativePaymentManifestParserAndroid != 0;
-        nativeParsePaymentMethodManifest(mNativePaymentManifestParserAndroid, content, callback);
+        PaymentManifestParserJni.get().parsePaymentMethodManifest(
+                mNativePaymentManifestParserAndroid, content, callback);
     }
 
     /**
@@ -91,7 +95,8 @@
     public void parseWebAppManifest(String content, ManifestParseCallback callback) {
         ThreadUtils.assertOnUiThread();
         assert mNativePaymentManifestParserAndroid != 0;
-        nativeParseWebAppManifest(mNativePaymentManifestParserAndroid, content, callback);
+        PaymentManifestParserJni.get().parseWebAppManifest(
+                mNativePaymentManifestParserAndroid, content, callback);
     }
 
     @CalledByNative
@@ -126,12 +131,13 @@
         manifest[sectionIndex].fingerprints[fingerprintIndex] = fingerprint;
     }
 
-    private static native long nativeCreatePaymentManifestParserAndroid(WebContents webContents);
-    private static native void nativeDestroyPaymentManifestParserAndroid(
-            long nativePaymentManifestParserAndroid);
-    private static native void nativeParsePaymentMethodManifest(
-            long nativePaymentManifestParserAndroid, String content,
-            ManifestParseCallback callback);
-    private static native void nativeParseWebAppManifest(long nativePaymentManifestParserAndroid,
-            String content, ManifestParseCallback callback);
+    @NativeMethods
+    interface Natives {
+        long createPaymentManifestParserAndroid(WebContents webContents);
+        void destroyPaymentManifestParserAndroid(long nativePaymentManifestParserAndroid);
+        void parsePaymentMethodManifest(long nativePaymentManifestParserAndroid, String content,
+                ManifestParseCallback callback);
+        void parseWebAppManifest(long nativePaymentManifestParserAndroid, String content,
+                ManifestParseCallback callback);
+    }
 }
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentValidator.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentValidator.java
index eaf993a9..5dbd0b2 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentValidator.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentValidator.java
@@ -5,6 +5,7 @@
 package org.chromium.components.payments;
 
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.payments.mojom.PaymentDetails;
 import org.chromium.payments.mojom.PaymentValidationErrors;
 
@@ -19,16 +20,19 @@
         if (details == null) {
             return false;
         }
-        return nativeValidatePaymentDetailsAndroid(details.serialize());
+        return PaymentValidatorJni.get().validatePaymentDetailsAndroid(details.serialize());
     }
 
     public static boolean validatePaymentValidationErrors(PaymentValidationErrors errors) {
         if (errors == null) {
             return false;
         }
-        return nativeValidatePaymentValidationErrorsAndroid(errors.serialize());
+        return PaymentValidatorJni.get().validatePaymentValidationErrorsAndroid(errors.serialize());
     }
 
-    private static native boolean nativeValidatePaymentDetailsAndroid(ByteBuffer buffer);
-    private static native boolean nativeValidatePaymentValidationErrorsAndroid(ByteBuffer buffer);
+    @NativeMethods
+    interface Natives {
+        boolean validatePaymentDetailsAndroid(ByteBuffer buffer);
+        boolean validatePaymentValidationErrorsAndroid(ByteBuffer buffer);
+    }
 };
diff --git a/components/policy/android/BUILD.gn b/components/policy/android/BUILD.gn
index fc58cd7..0c1e5c9 100644
--- a/components/policy/android/BUILD.gn
+++ b/components/policy/android/BUILD.gn
@@ -12,7 +12,10 @@
 android_library("policy_java") {
   deps = [
     "//base:base_java",
+    "//base:jni_java",
   ]
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+
   java_files =
       _jni_sources + [
         "java/src/org/chromium/policy/AbstractAppRestrictionsProvider.java",
diff --git a/components/safe_browsing/android/BUILD.gn b/components/safe_browsing/android/BUILD.gn
index ddae4c5..ce629d76 100644
--- a/components/safe_browsing/android/BUILD.gn
+++ b/components/safe_browsing/android/BUILD.gn
@@ -8,8 +8,10 @@
 android_library("safe_browsing_java") {
   deps = [
     "//base:base_java",
+    "//base:jni_java",
     "//third_party/android_deps:androidx_annotation_annotation_java",
   ]
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   java_files = [
     "java/src/org/chromium/components/safe_browsing/SafeBrowsingApiBridge.java",
     "java/src/org/chromium/components/safe_browsing/SafeBrowsingApiHandler.java",
diff --git a/components/safe_browsing/android/java/src/org/chromium/components/safe_browsing/SafeBrowsingApiBridge.java b/components/safe_browsing/android/java/src/org/chromium/components/safe_browsing/SafeBrowsingApiBridge.java
index 0ad1a797..1cf2fb65 100644
--- a/components/safe_browsing/android/java/src/org/chromium/components/safe_browsing/SafeBrowsingApiBridge.java
+++ b/components/safe_browsing/android/java/src/org/chromium/components/safe_browsing/SafeBrowsingApiBridge.java
@@ -7,6 +7,7 @@
 import org.chromium.base.Log;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.metrics.RecordHistogram;
 
 import java.lang.reflect.InvocationTargetException;
@@ -53,9 +54,10 @@
                     @Override
                     public void onUrlCheckDone(
                             long callbackId, int resultStatus, String metadata, long checkDelta) {
-                        nativeOnUrlCheckDone(callbackId, resultStatus, metadata, checkDelta);
+                        SafeBrowsingApiBridgeJni.get().onUrlCheckDone(
+                                callbackId, resultStatus, metadata, checkDelta);
                     }
-                }, nativeAreLocalBlacklistsEnabled());
+                }, SafeBrowsingApiBridgeJni.get().areLocalBlacklistsEnabled());
         return initSuccesssful ? handler : null;
     }
 
@@ -97,13 +99,15 @@
         return matched;
     }
 
-    private static native boolean nativeAreLocalBlacklistsEnabled();
-    private static native void nativeOnUrlCheckDone(
-            long callbackId, int resultStatus, String metadata, long checkDelta);
-
     // Histograms
     private static void recordAllowlistLookupTimeInMs(long lookupTimeInMs) {
         RecordHistogram.recordTimesHistogram(
                 "SB2.RemoteCall.LocalAllowlistLookupTime", lookupTimeInMs);
     }
+
+    @NativeMethods
+    interface Natives {
+        boolean areLocalBlacklistsEnabled();
+        void onUrlCheckDone(long callbackId, int resultStatus, String metadata, long checkDelta);
+    }
 }
diff --git a/components/search_engines/android/BUILD.gn b/components/search_engines/android/BUILD.gn
index d6b37fc..0247b73 100644
--- a/components/search_engines/android/BUILD.gn
+++ b/components/search_engines/android/BUILD.gn
@@ -7,8 +7,10 @@
 android_library("java") {
   deps = [
     "//base:base_java",
+    "//base:jni_java",
     "//content/public/android:content_java",
   ]
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
 
   java_files = [
     "java/src/org/chromium/components/search_engines/TemplateUrl.java",
diff --git a/components/search_engines/android/java/src/org/chromium/components/search_engines/TemplateUrl.java b/components/search_engines/android/java/src/org/chromium/components/search_engines/TemplateUrl.java
index 093eedd..6e40f28 100644
--- a/components/search_engines/android/java/src/org/chromium/components/search_engines/TemplateUrl.java
+++ b/components/search_engines/android/java/src/org/chromium/components/search_engines/TemplateUrl.java
@@ -4,6 +4,7 @@
 package org.chromium.components.search_engines;
 
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 
 import java.util.Locale;
 
@@ -28,7 +29,7 @@
      * @return The name of the search engine.
      */
     public String getShortName() {
-        return nativeGetShortName(mTemplateUrlPtr);
+        return TemplateUrlJni.get().getShortName(mTemplateUrlPtr);
     }
 
     /**
@@ -36,21 +37,21 @@
      *         non-zero, for custom search engines, it will return 0.
      */
     public int getPrepopulatedId() {
-        return nativeGetPrepopulatedId(mTemplateUrlPtr);
+        return TemplateUrlJni.get().getPrepopulatedId(mTemplateUrlPtr);
     }
 
     /**
      * @return Whether a search engine is prepopulated or created by policy.
      */
     public boolean getIsPrepopulated() {
-        return nativeIsPrepopulatedOrCreatedByPolicy(mTemplateUrlPtr);
+        return TemplateUrlJni.get().isPrepopulatedOrCreatedByPolicy(mTemplateUrlPtr);
     }
 
     /**
      * @return The keyword of the search engine.
      */
     public String getKeyword() {
-        return nativeGetKeyword(mTemplateUrlPtr);
+        return TemplateUrlJni.get().getKeyword(mTemplateUrlPtr);
     }
 
     /**
@@ -58,7 +59,7 @@
      *         return 0.
      */
     public long getLastVisitedTime() {
-        return nativeGetLastVisitedTime(mTemplateUrlPtr);
+        return TemplateUrlJni.get().getLastVisitedTime(mTemplateUrlPtr);
     }
 
     /**
@@ -66,7 +67,7 @@
      *         prepopulated_engines.json.
      */
     public String getURL() {
-        return nativeGetURL(mTemplateUrlPtr);
+        return TemplateUrlJni.get().getURL(mTemplateUrlPtr);
     }
 
     @Override
@@ -84,10 +85,13 @@
                 getKeyword(), getShortName(), getIsPrepopulated());
     }
 
-    private static native String nativeGetShortName(long templateUrlPtr);
-    private static native String nativeGetKeyword(long templateUrlPtr);
-    private static native boolean nativeIsPrepopulatedOrCreatedByPolicy(long templateUrlPtr);
-    private static native long nativeGetLastVisitedTime(long templateUrlPtr);
-    private static native int nativeGetPrepopulatedId(long templateUrlPtr);
-    private static native String nativeGetURL(long templateUrlPtr);
+    @NativeMethods
+    interface Natives {
+        String getShortName(long templateUrlPtr);
+        String getKeyword(long templateUrlPtr);
+        boolean isPrepopulatedOrCreatedByPolicy(long templateUrlPtr);
+        long getLastVisitedTime(long templateUrlPtr);
+        int getPrepopulatedId(long templateUrlPtr);
+        String getURL(long templateUrlPtr);
+    }
 }
diff --git a/components/search_engines/android/java/src/org/chromium/components/search_engines/TemplateUrlService.java b/components/search_engines/android/java/src/org/chromium/components/search_engines/TemplateUrlService.java
index fdc15e75..87b6a34f 100644
--- a/components/search_engines/android/java/src/org/chromium/components/search_engines/TemplateUrlService.java
+++ b/components/search_engines/android/java/src/org/chromium/components/search_engines/TemplateUrlService.java
@@ -10,6 +10,7 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.task.PostTask;
 import org.chromium.content_public.browser.UiThreadTaskTraits;
 
@@ -63,12 +64,13 @@
 
     public boolean isLoaded() {
         ThreadUtils.assertOnUiThread();
-        return nativeIsLoaded(mNativeTemplateUrlServiceAndroid);
+        return TemplateUrlServiceJni.get().isLoaded(
+                mNativeTemplateUrlServiceAndroid, TemplateUrlService.this);
     }
 
     public void load() {
         ThreadUtils.assertOnUiThread();
-        nativeLoad(mNativeTemplateUrlServiceAndroid);
+        TemplateUrlServiceJni.get().load(mNativeTemplateUrlServiceAndroid, TemplateUrlService.this);
     }
 
     /**
@@ -102,7 +104,8 @@
     public List<TemplateUrl> getTemplateUrls() {
         ThreadUtils.assertOnUiThread();
         List<TemplateUrl> templateUrls = new ArrayList<>();
-        nativeGetTemplateUrls(mNativeTemplateUrlServiceAndroid, templateUrls);
+        TemplateUrlServiceJni.get().getTemplateUrls(
+                mNativeTemplateUrlServiceAndroid, TemplateUrlService.this, templateUrls);
         return templateUrls;
     }
 
@@ -141,13 +144,14 @@
      */
     public @Nullable TemplateUrl getDefaultSearchEngineTemplateUrl() {
         if (!isLoaded()) return null;
-        return nativeGetDefaultSearchEngine(mNativeTemplateUrlServiceAndroid);
+        return TemplateUrlServiceJni.get().getDefaultSearchEngine(
+                mNativeTemplateUrlServiceAndroid, TemplateUrlService.this);
     }
 
     public void setSearchEngine(String selectedKeyword) {
         ThreadUtils.assertOnUiThread();
-        nativeSetUserSelectedDefaultSearchProvider(
-                mNativeTemplateUrlServiceAndroid, selectedKeyword);
+        TemplateUrlServiceJni.get().setUserSelectedDefaultSearchProvider(
+                mNativeTemplateUrlServiceAndroid, TemplateUrlService.this, selectedKeyword);
     }
 
     /**
@@ -155,7 +159,8 @@
      *         DSE can not be modified by the user.
      */
     public boolean isDefaultSearchManaged() {
-        return nativeIsDefaultSearchManaged(mNativeTemplateUrlServiceAndroid);
+        return TemplateUrlServiceJni.get().isDefaultSearchManaged(
+                mNativeTemplateUrlServiceAndroid, TemplateUrlService.this);
     }
 
     /**
@@ -163,14 +168,16 @@
      */
     public boolean isSearchByImageAvailable() {
         ThreadUtils.assertOnUiThread();
-        return nativeIsSearchByImageAvailable(mNativeTemplateUrlServiceAndroid);
+        return TemplateUrlServiceJni.get().isSearchByImageAvailable(
+                mNativeTemplateUrlServiceAndroid, TemplateUrlService.this);
     }
 
     /**
      * @return Whether the default configured search engine is for a Google property.
      */
     public boolean isDefaultSearchEngineGoogle() {
-        return nativeIsDefaultSearchEngineGoogle(mNativeTemplateUrlServiceAndroid);
+        return TemplateUrlServiceJni.get().isDefaultSearchEngineGoogle(
+                mNativeTemplateUrlServiceAndroid, TemplateUrlService.this);
     }
 
     /**
@@ -180,8 +187,8 @@
      */
     public boolean isSearchResultsPageFromDefaultSearchProvider(String url) {
         ThreadUtils.assertOnUiThread();
-        return nativeIsSearchResultsPageFromDefaultSearchProvider(
-                mNativeTemplateUrlServiceAndroid, url);
+        return TemplateUrlServiceJni.get().isSearchResultsPageFromDefaultSearchProvider(
+                mNativeTemplateUrlServiceAndroid, TemplateUrlService.this, url);
     }
 
     /**
@@ -239,7 +246,8 @@
      *              {@code query} inserted as the search parameter.
      */
     public String getUrlForSearchQuery(String query) {
-        return nativeGetUrlForSearchQuery(mNativeTemplateUrlServiceAndroid, query);
+        return TemplateUrlServiceJni.get().getUrlForSearchQuery(
+                mNativeTemplateUrlServiceAndroid, TemplateUrlService.this, query);
     }
 
     /**
@@ -251,7 +259,8 @@
      *              {@code query} inserted as the search parameter and voice input source param set.
      */
     public String getUrlForVoiceSearchQuery(String query) {
-        return nativeGetUrlForVoiceSearchQuery(mNativeTemplateUrlServiceAndroid, query);
+        return TemplateUrlServiceJni.get().getUrlForVoiceSearchQuery(
+                mNativeTemplateUrlServiceAndroid, TemplateUrlService.this, query);
     }
 
     /**
@@ -267,8 +276,9 @@
      */
     public String getUrlForContextualSearchQuery(
             String query, String alternateTerm, boolean shouldPrefetch, String protocolVersion) {
-        return nativeGetUrlForContextualSearchQuery(mNativeTemplateUrlServiceAndroid, query,
-                alternateTerm, shouldPrefetch, protocolVersion);
+        return TemplateUrlServiceJni.get().getUrlForContextualSearchQuery(
+                mNativeTemplateUrlServiceAndroid, TemplateUrlService.this, query, alternateTerm,
+                shouldPrefetch, protocolVersion);
     }
 
     /**
@@ -277,7 +287,8 @@
      * @return      A {@link String} that contains the url of the specified search engine.
      */
     public String getSearchEngineUrlFromTemplateUrl(String keyword) {
-        return nativeGetSearchEngineUrlFromTemplateUrl(mNativeTemplateUrlServiceAndroid, keyword);
+        return TemplateUrlServiceJni.get().getSearchEngineUrlFromTemplateUrl(
+                mNativeTemplateUrlServiceAndroid, TemplateUrlService.this, keyword);
     }
 
     /**
@@ -286,7 +297,8 @@
      * @return      The search engine type of the specified search engine that contains the keyword.
      */
     public int getSearchEngineTypeFromTemplateUrl(String keyword) {
-        return nativeGetSearchEngineTypeFromTemplateUrl(mNativeTemplateUrlServiceAndroid, keyword);
+        return TemplateUrlServiceJni.get().getSearchEngineTypeFromTemplateUrl(
+                mNativeTemplateUrlServiceAndroid, TemplateUrlService.this, keyword);
     }
 
     /**
@@ -300,47 +312,57 @@
      */
     public boolean setPlayAPISearchEngine(
             String name, String keyword, String searchUrl, String faviconUrl) {
-        return nativeSetPlayAPISearchEngine(
-                mNativeTemplateUrlServiceAndroid, name, keyword, searchUrl, faviconUrl);
+        return TemplateUrlServiceJni.get().setPlayAPISearchEngine(mNativeTemplateUrlServiceAndroid,
+                TemplateUrlService.this, name, keyword, searchUrl, faviconUrl);
     }
 
     @VisibleForTesting
     public String addSearchEngineForTesting(String keyword, int ageInDays) {
-        return nativeAddSearchEngineForTesting(
-                mNativeTemplateUrlServiceAndroid, keyword, ageInDays);
+        return TemplateUrlServiceJni.get().addSearchEngineForTesting(
+                mNativeTemplateUrlServiceAndroid, TemplateUrlService.this, keyword, ageInDays);
     }
 
     @VisibleForTesting
     public String updateLastVisitedForTesting(String keyword) {
-        return nativeUpdateLastVisitedForTesting(mNativeTemplateUrlServiceAndroid, keyword);
+        return TemplateUrlServiceJni.get().updateLastVisitedForTesting(
+                mNativeTemplateUrlServiceAndroid, TemplateUrlService.this, keyword);
     }
 
-    private native void nativeLoad(long nativeTemplateUrlServiceAndroid);
-    private native boolean nativeIsLoaded(long nativeTemplateUrlServiceAndroid);
-    private native void nativeSetUserSelectedDefaultSearchProvider(
-            long nativeTemplateUrlServiceAndroid, String selectedKeyword);
-    private native boolean nativeIsDefaultSearchManaged(long nativeTemplateUrlServiceAndroid);
-    private native boolean nativeIsSearchResultsPageFromDefaultSearchProvider(
-            long nativeTemplateUrlServiceAndroid, String url);
-    private native boolean nativeIsSearchByImageAvailable(long nativeTemplateUrlServiceAndroid);
-    private native boolean nativeIsDefaultSearchEngineGoogle(long nativeTemplateUrlServiceAndroid);
-    private native String nativeGetUrlForSearchQuery(
-            long nativeTemplateUrlServiceAndroid, String query);
-    private native String nativeGetUrlForVoiceSearchQuery(
-            long nativeTemplateUrlServiceAndroid, String query);
-    private native String nativeGetUrlForContextualSearchQuery(long nativeTemplateUrlServiceAndroid,
-            String query, String alternateTerm, boolean shouldPrefetch, String protocolVersion);
-    private native String nativeGetSearchEngineUrlFromTemplateUrl(
-            long nativeTemplateUrlServiceAndroid, String keyword);
-    private native int nativeGetSearchEngineTypeFromTemplateUrl(
-            long nativeTemplateUrlServiceAndroid, String keyword);
-    private native String nativeAddSearchEngineForTesting(
-            long nativeTemplateUrlServiceAndroid, String keyword, int offset);
-    private native boolean nativeSetPlayAPISearchEngine(long nativeTemplateUrlServiceAndroid,
-            String name, String keyword, String searchUrl, String faviconUrl);
-    private native String nativeUpdateLastVisitedForTesting(
-            long nativeTemplateUrlServiceAndroid, String keyword);
-    private native void nativeGetTemplateUrls(
-            long nativeTemplateUrlServiceAndroid, List<TemplateUrl> templateUrls);
-    private native TemplateUrl nativeGetDefaultSearchEngine(long nativeTemplateUrlServiceAndroid);
+    @NativeMethods
+    interface Natives {
+        void load(long nativeTemplateUrlServiceAndroid, TemplateUrlService caller);
+        boolean isLoaded(long nativeTemplateUrlServiceAndroid, TemplateUrlService caller);
+        void setUserSelectedDefaultSearchProvider(long nativeTemplateUrlServiceAndroid,
+                TemplateUrlService caller, String selectedKeyword);
+        boolean isDefaultSearchManaged(
+                long nativeTemplateUrlServiceAndroid, TemplateUrlService caller);
+        boolean isSearchResultsPageFromDefaultSearchProvider(
+                long nativeTemplateUrlServiceAndroid, TemplateUrlService caller, String url);
+        boolean isSearchByImageAvailable(
+                long nativeTemplateUrlServiceAndroid, TemplateUrlService caller);
+        boolean isDefaultSearchEngineGoogle(
+                long nativeTemplateUrlServiceAndroid, TemplateUrlService caller);
+        String getUrlForSearchQuery(
+                long nativeTemplateUrlServiceAndroid, TemplateUrlService caller, String query);
+        String getUrlForVoiceSearchQuery(
+                long nativeTemplateUrlServiceAndroid, TemplateUrlService caller, String query);
+        String getUrlForContextualSearchQuery(long nativeTemplateUrlServiceAndroid,
+                TemplateUrlService caller, String query, String alternateTerm,
+                boolean shouldPrefetch, String protocolVersion);
+        String getSearchEngineUrlFromTemplateUrl(
+                long nativeTemplateUrlServiceAndroid, TemplateUrlService caller, String keyword);
+        int getSearchEngineTypeFromTemplateUrl(
+                long nativeTemplateUrlServiceAndroid, TemplateUrlService caller, String keyword);
+        String addSearchEngineForTesting(long nativeTemplateUrlServiceAndroid,
+                TemplateUrlService caller, String keyword, int offset);
+        boolean setPlayAPISearchEngine(long nativeTemplateUrlServiceAndroid,
+                TemplateUrlService caller, String name, String keyword, String searchUrl,
+                String faviconUrl);
+        String updateLastVisitedForTesting(
+                long nativeTemplateUrlServiceAndroid, TemplateUrlService caller, String keyword);
+        void getTemplateUrls(long nativeTemplateUrlServiceAndroid, TemplateUrlService caller,
+                List<TemplateUrl> templateUrls);
+        TemplateUrl getDefaultSearchEngine(
+                long nativeTemplateUrlServiceAndroid, TemplateUrlService caller);
+    }
 }
diff --git a/components/signin/core/browser/android/java/src/org/chromium/components/signin/ChildAccountInfoFetcher.java b/components/signin/core/browser/android/java/src/org/chromium/components/signin/ChildAccountInfoFetcher.java
index 37490a0..d9382f3 100644
--- a/components/signin/core/browser/android/java/src/org/chromium/components/signin/ChildAccountInfoFetcher.java
+++ b/components/signin/core/browser/android/java/src/org/chromium/components/signin/ChildAccountInfoFetcher.java
@@ -14,6 +14,7 @@
 import org.chromium.base.Log;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 
 /**
  * ChildAccountInfoFetcher for the Android platform.
@@ -81,7 +82,8 @@
     private void setIsChildAccount(boolean isChildAccount) {
         Log.d(TAG, "Setting child account status for %s to %s", mAccount.name,
                 Boolean.toString(isChildAccount));
-        nativeSetIsChildAccount(mNativeAccountFetcherService, mAccountId, isChildAccount);
+        ChildAccountInfoFetcherJni.get().setIsChildAccount(
+                mNativeAccountFetcherService, mAccountId, isChildAccount);
     }
 
     @CalledByNative
@@ -90,6 +92,9 @@
         AccountManagerFacade.overrideAccountManagerFacadeForTests(delegate);
     }
 
-    private static native void nativeSetIsChildAccount(
-            long accountFetcherServicePtr, String accountId, boolean isChildAccount);
+    @NativeMethods
+    interface Natives {
+        void setIsChildAccount(
+                long accountFetcherServicePtr, String accountId, boolean isChildAccount);
+    }
 }
diff --git a/components/signin/core/browser/android/java/src/org/chromium/components/signin/OAuth2TokenService.java b/components/signin/core/browser/android/java/src/org/chromium/components/signin/OAuth2TokenService.java
index 95588a6..a13a14f 100644
--- a/components/signin/core/browser/android/java/src/org/chromium/components/signin/OAuth2TokenService.java
+++ b/components/signin/core/browser/android/java/src/org/chromium/components/signin/OAuth2TokenService.java
@@ -16,6 +16,7 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.task.AsyncTask;
 import org.chromium.net.NetworkChangeNotifier;
 
@@ -134,19 +135,22 @@
             String username, String scope, final long nativeCallback) {
         Account account = getAccountOrNullFromUsername(username);
         if (account == null) {
-            ThreadUtils.postOnUiThread(() -> nativeOAuth2TokenFetched(null, false, nativeCallback));
+            ThreadUtils.postOnUiThread(()
+                                               -> OAuth2TokenServiceJni.get().oAuth2TokenFetched(
+                                                       null, false, nativeCallback));
             return;
         }
         String oauth2Scope = OAUTH2_SCOPE_PREFIX + scope;
         getAccessToken(account, oauth2Scope, new GetAccessTokenCallback() {
             @Override
             public void onGetTokenSuccess(String token) {
-                nativeOAuth2TokenFetched(token, false, nativeCallback);
+                OAuth2TokenServiceJni.get().oAuth2TokenFetched(token, false, nativeCallback);
             }
 
             @Override
             public void onGetTokenFailure(boolean isTransientError) {
-                nativeOAuth2TokenFetched(null, isTransientError, nativeCallback);
+                OAuth2TokenServiceJni.get().oAuth2TokenFetched(
+                        null, isTransientError, nativeCallback);
             }
         });
     }
@@ -282,7 +286,8 @@
             // change (re-signin or sign out signed-in account).
             currentlySignedInAccount = null;
         }
-        nativeUpdateAccountList(mNativeOAuth2TokenServiceDelegate, currentlySignedInAccount);
+        OAuth2TokenServiceJni.get().updateAccountList(mNativeOAuth2TokenServiceDelegate,
+                OAuth2TokenService.this, currentlySignedInAccount);
     }
 
     private boolean isSignedInAccountChanged(String signedInAccountName) {
@@ -391,8 +396,10 @@
         }
     }
 
-    private static native void nativeOAuth2TokenFetched(
-            String authToken, boolean isTransientError, long nativeCallback);
-    private native void nativeUpdateAccountList(
-            long nativeOAuth2TokenServiceDelegateAndroid, String currentlySignedInAccount);
+    @NativeMethods
+    interface Natives {
+        void oAuth2TokenFetched(String authToken, boolean isTransientError, long nativeCallback);
+        void updateAccountList(long nativeOAuth2TokenServiceDelegateAndroid,
+                OAuth2TokenService caller, String currentlySignedInAccount);
+    }
 }
diff --git a/components/spellcheck/browser/android/BUILD.gn b/components/spellcheck/browser/android/BUILD.gn
index 74404fcc..cd871f5 100644
--- a/components/spellcheck/browser/android/BUILD.gn
+++ b/components/spellcheck/browser/android/BUILD.gn
@@ -13,7 +13,9 @@
 android_library("java") {
   deps = [
     "//base:base_java",
+    "//base:jni_java",
   ]
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
 
   java_files = [ "java/src/org/chromium/components/spellcheck/SpellCheckerSessionBridge.java" ]
 }
diff --git a/components/spellcheck/browser/android/java/src/org/chromium/components/spellcheck/SpellCheckerSessionBridge.java b/components/spellcheck/browser/android/java/src/org/chromium/components/spellcheck/SpellCheckerSessionBridge.java
index e65096c..db691fcc 100644
--- a/components/spellcheck/browser/android/java/src/org/chromium/components/spellcheck/SpellCheckerSessionBridge.java
+++ b/components/spellcheck/browser/android/java/src/org/chromium/components/spellcheck/SpellCheckerSessionBridge.java
@@ -15,6 +15,7 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.metrics.RecordHistogram;
 
 import java.util.ArrayList;
@@ -136,7 +137,8 @@
                 }
             }
         }
-        nativeProcessSpellCheckResults(mNativeSpellCheckerSessionBridge,
+        SpellCheckerSessionBridgeJni.get().processSpellCheckResults(
+                mNativeSpellCheckerSessionBridge, SpellCheckerSessionBridge.this,
                 convertListToArray(offsets), convertListToArray(lengths),
                 suggestions.toArray(new String[suggestions.size()][]));
 
@@ -159,6 +161,10 @@
     @Override
     public void onGetSuggestions(SuggestionsInfo[] results) {}
 
-    private native void nativeProcessSpellCheckResults(long nativeSpellCheckerSessionBridge,
-            int[] offsets, int[] lengths, String[][] suggestions);
+    @NativeMethods
+    interface Natives {
+        void processSpellCheckResults(long nativeSpellCheckerSessionBridge,
+                SpellCheckerSessionBridge caller, int[] offsets, int[] lengths,
+                String[][] suggestions);
+    }
 }
diff --git a/components/sync/android/BUILD.gn b/components/sync/android/BUILD.gn
index e920b6fd..3a51dc2 100644
--- a/components/sync/android/BUILD.gn
+++ b/components/sync/android/BUILD.gn
@@ -8,6 +8,7 @@
 android_library("sync_java") {
   deps = [
     "//base:base_java",
+    "//base:jni_java",
     "//components/signin/core/browser/android:java",
     "//net/android:net_java",
     "//third_party/android_deps:androidx_annotation_annotation_java",
@@ -16,6 +17,7 @@
     "//third_party/cacheinvalidation:cacheinvalidation_proto_java",
     "//third_party/jsr-305:jsr_305_javalib",
   ]
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   srcjar_deps = [ ":java_enums" ]
   java_files = [
     "java/src/org/chromium/components/sync/AndroidSyncSettings.java",
diff --git a/components/sync/android/java/src/org/chromium/components/sync/ModelTypeHelper.java b/components/sync/android/java/src/org/chromium/components/sync/ModelTypeHelper.java
index 9ac87a5e..16bc101 100644
--- a/components/sync/android/java/src/org/chromium/components/sync/ModelTypeHelper.java
+++ b/components/sync/android/java/src/org/chromium/components/sync/ModelTypeHelper.java
@@ -10,6 +10,7 @@
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 
 import java.util.Collection;
 import java.util.HashSet;
@@ -100,7 +101,7 @@
         if (modelType == ModelType.PROXY_TABS) {
             return "PROXY_TABS";
         }
-        return nativeModelTypeToNotificationType(modelType);
+        return ModelTypeHelperJni.get().modelTypeToNotificationType(modelType);
     }
 
     /**
@@ -125,5 +126,8 @@
         sDelegate = delegate;
     }
 
-    private static native String nativeModelTypeToNotificationType(int modelType);
+    @NativeMethods
+    interface Natives {
+        String modelTypeToNotificationType(int modelType);
+    }
 }
diff --git a/components/translate/core/browser/translate_prefs.cc b/components/translate/core/browser/translate_prefs.cc
index 32e1ec5..2d985a1 100644
--- a/components/translate/core/browser/translate_prefs.cc
+++ b/components/translate/core/browser/translate_prefs.cc
@@ -251,7 +251,7 @@
     // data so that Chrome won't try to translate to it next time Translate is
     // triggered.
     if (chrome_language == GetRecentTargetLanguage())
-      SetRecentTargetLanguage("");
+      ResetRecentTargetLanguage();
 
     languages.erase(it);
     PurgeUnsupportedLanguagesInLanguageFamily(chrome_language, &languages);
@@ -789,6 +789,10 @@
   prefs_->SetString(kPrefTranslateRecentTarget, target_language);
 }
 
+void TranslatePrefs::ResetRecentTargetLanguage() {
+  SetRecentTargetLanguage("");
+}
+
 std::string TranslatePrefs::GetRecentTargetLanguage() const {
   return prefs_->GetString(kPrefTranslateRecentTarget);
 }
diff --git a/components/translate/core/browser/translate_prefs.h b/components/translate/core/browser/translate_prefs.h
index 85823c1..2a7f647 100644
--- a/components/translate/core/browser/translate_prefs.h
+++ b/components/translate/core/browser/translate_prefs.h
@@ -300,6 +300,7 @@
   // Stores and retrieves the last-observed translate target language. Used to
   // determine which target language to offer in future.
   void SetRecentTargetLanguage(const std::string& target_language);
+  void ResetRecentTargetLanguage();
   std::string GetRecentTargetLanguage() const;
 
   // Gets the value for the pref that represents how often the
diff --git a/components/url_formatter/android/BUILD.gn b/components/url_formatter/android/BUILD.gn
index 12273aad..a664229 100644
--- a/components/url_formatter/android/BUILD.gn
+++ b/components/url_formatter/android/BUILD.gn
@@ -7,7 +7,9 @@
 android_library("url_formatter_java") {
   deps = [
     "//base:base_java",
+    "//base:jni_java",
   ]
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
 
   java_files =
       [ "java/src/org/chromium/components/url_formatter/UrlFormatter.java" ]
diff --git a/components/url_formatter/android/java/src/org/chromium/components/url_formatter/UrlFormatter.java b/components/url_formatter/android/java/src/org/chromium/components/url_formatter/UrlFormatter.java
index 88b43de..bc4a46a9 100644
--- a/components/url_formatter/android/java/src/org/chromium/components/url_formatter/UrlFormatter.java
+++ b/components/url_formatter/android/java/src/org/chromium/components/url_formatter/UrlFormatter.java
@@ -6,7 +6,9 @@
 
 import android.text.TextUtils;
 
+import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 
 /**
  * Wrapper for utilities in url_formatter.
@@ -23,7 +25,7 @@
      *  - "..." -> null
      */
     public static String fixupUrl(String uri) {
-        return TextUtils.isEmpty(uri) ? null : nativeFixupUrl(uri);
+        return TextUtils.isEmpty(uri) ? null : UrlFormatterJni.get().fixupUrl(uri);
     }
 
     /**
@@ -42,7 +44,7 @@
      * @return Formatted URL.
      */
     public static String formatUrlForDisplayOmitScheme(String uri) {
-        return nativeFormatUrlForDisplayOmitScheme(uri);
+        return UrlFormatterJni.get().formatUrlForDisplayOmitScheme(uri);
     }
 
     /**
@@ -62,7 +64,7 @@
      * @return Formatted URL.
      */
     public static String formatUrlForDisplayOmitHTTPScheme(String uri) {
-        return nativeFormatUrlForDisplayOmitHTTPScheme(uri);
+        return UrlFormatterJni.get().formatUrlForDisplayOmitHTTPScheme(uri);
     }
 
     /**
@@ -75,7 +77,7 @@
      * @return Formatted URL.
      */
     public static String formatUrlForCopy(String uri) {
-        return nativeFormatUrlForCopy(uri);
+        return UrlFormatterJni.get().formatUrlForCopy(uri);
     }
 
     /**
@@ -85,7 +87,7 @@
      *         it fails to parse it.
      */
     public static String formatUrlForSecurityDisplay(String uri) {
-        return nativeFormatUrlForSecurityDisplay(uri);
+        return UrlFormatterJni.get().formatUrlForSecurityDisplay(uri);
     }
 
     /**
@@ -95,13 +97,17 @@
      *         it fails to parse it.
      */
     public static String formatUrlForSecurityDisplayOmitScheme(String uri) {
-        return nativeFormatUrlForSecurityDisplayOmitScheme(uri);
+        return UrlFormatterJni.get().formatUrlForSecurityDisplayOmitScheme(uri);
     }
 
-    private static native String nativeFixupUrl(String url);
-    private static native String nativeFormatUrlForDisplayOmitScheme(String url);
-    private static native String nativeFormatUrlForDisplayOmitHTTPScheme(String url);
-    private static native String nativeFormatUrlForCopy(String url);
-    private static native String nativeFormatUrlForSecurityDisplay(String url);
-    private static native String nativeFormatUrlForSecurityDisplayOmitScheme(String url);
+    @VisibleForTesting
+    @NativeMethods
+    public interface Natives {
+        String fixupUrl(String url);
+        String formatUrlForDisplayOmitScheme(String url);
+        String formatUrlForDisplayOmitHTTPScheme(String url);
+        String formatUrlForCopy(String url);
+        String formatUrlForSecurityDisplay(String url);
+        String formatUrlForSecurityDisplayOmitScheme(String url);
+    }
 }
diff --git a/components/variations/android/BUILD.gn b/components/variations/android/BUILD.gn
index 95e4043..7340c2b53 100644
--- a/components/variations/android/BUILD.gn
+++ b/components/variations/android/BUILD.gn
@@ -7,8 +7,10 @@
 android_library("variations_java") {
   deps = [
     "//base:base_java",
+    "//base:jni_java",
     "//third_party/android_deps:com_android_support_support_core_utils_java",
   ]
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   java_files = [
     "java/src/org/chromium/components/variations/VariationsAssociatedData.java",
     "java/src/org/chromium/components/variations/firstrun/VariationsSeedBridge.java",
diff --git a/components/variations/android/java/src/org/chromium/components/variations/VariationsAssociatedData.java b/components/variations/android/java/src/org/chromium/components/variations/VariationsAssociatedData.java
index 8d7264d..914e84a 100644
--- a/components/variations/android/java/src/org/chromium/components/variations/VariationsAssociatedData.java
+++ b/components/variations/android/java/src/org/chromium/components/variations/VariationsAssociatedData.java
@@ -5,6 +5,7 @@
 package org.chromium.components.variations;
 
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
 
 import java.util.HashMap;
 
@@ -24,15 +25,18 @@
      *     parameter does not exist.
      */
     public static String getVariationParamValue(String trialName, String paramName) {
-        return nativeGetVariationParamValue(trialName, paramName);
+        return VariationsAssociatedDataJni.get().getVariationParamValue(trialName, paramName);
     }
 
     public static HashMap<String, String> getFeedbackMap() {
         HashMap<String, String> map = new HashMap<String, String>();
-        map.put("Chrome Variations", nativeGetFeedbackVariations());
+        map.put("Chrome Variations", VariationsAssociatedDataJni.get().getFeedbackVariations());
         return map;
     }
 
-    private static native String nativeGetVariationParamValue(String trialName, String paramName);
-    private static native String nativeGetFeedbackVariations();
+    @NativeMethods
+    interface Natives {
+        String getVariationParamValue(String trialName, String paramName);
+        String getFeedbackVariations();
+    }
 }
diff --git a/components/viz/service/BUILD.gn b/components/viz/service/BUILD.gn
index a3fc1b3..cd25831 100644
--- a/components/viz/service/BUILD.gn
+++ b/components/viz/service/BUILD.gn
@@ -546,8 +546,10 @@
   android_library("service_java") {
     deps = [
       "//base:base_java",
+      "//base:jni_java",
       "//ui/android:ui_full_java",
     ]
+    annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
     java_files = [
       "java/src/org/chromium/components/viz/service/gl/ThrowUncaughtException.java",
       "java/src/org/chromium/components/viz/service/frame_sinks/ExternalBeginFrameSourceAndroid.java",
diff --git a/components/viz/service/java/src/org/chromium/components/viz/service/frame_sinks/ExternalBeginFrameSourceAndroid.java b/components/viz/service/java/src/org/chromium/components/viz/service/frame_sinks/ExternalBeginFrameSourceAndroid.java
index 4d3d3c4..29b137d 100644
--- a/components/viz/service/java/src/org/chromium/components/viz/service/frame_sinks/ExternalBeginFrameSourceAndroid.java
+++ b/components/viz/service/java/src/org/chromium/components/viz/service/frame_sinks/ExternalBeginFrameSourceAndroid.java
@@ -8,6 +8,7 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.MainDex;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.ui.VSyncMonitor;
 
 /**
@@ -25,7 +26,8 @@
             if (!mVSyncNotificationsEnabled) {
                 return;
             }
-            nativeOnVSync(mNativeExternalBeginFrameSourceAndroid, vsyncTimeMicros,
+            ExternalBeginFrameSourceAndroidJni.get().onVSync(mNativeExternalBeginFrameSourceAndroid,
+                    ExternalBeginFrameSourceAndroid.this, vsyncTimeMicros,
                     mVSyncMonitor.getVSyncPeriodInMicroseconds());
             mVSyncMonitor.requestUpdate();
         }
@@ -56,6 +58,10 @@
         mVSyncMonitor.updateRefreshRate(refreshRate);
     }
 
-    private native void nativeOnVSync(long nativeExternalBeginFrameSourceAndroid,
-            long vsyncTimeMicros, long vsyncPeriodMicros);
+    @NativeMethods
+    interface Natives {
+        void onVSync(long nativeExternalBeginFrameSourceAndroid,
+                ExternalBeginFrameSourceAndroid caller, long vsyncTimeMicros,
+                long vsyncPeriodMicros);
+    }
 };
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc
index fb30517..a42761f 100644
--- a/content/browser/accessibility/browser_accessibility.cc
+++ b/content/browser/accessibility/browser_accessibility.cc
@@ -1897,6 +1897,9 @@
     case ax::mojom::Role::kHeaderAsNonLandmark:
       return content_client->GetLocalizedString(IDS_AX_ROLE_HEADER);
 
+    case ax::mojom::Role::kMark:
+      return content_client->GetLocalizedString(IDS_AX_ROLE_MARK);
+
     case ax::mojom::Role::kMeter:
       return content_client->GetLocalizedString(IDS_AX_ROLE_METER);
 
diff --git a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
index 63938e3..29932b3 100644
--- a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
+++ b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
@@ -720,6 +720,7 @@
       "<input type='tel'>"
       "<input type='url'>"
       "<input type='week'>"
+      "<mark></mark>"
       "<meter></meter>"
       "<output></output>"
       "<time></time>"
@@ -730,7 +731,7 @@
 
   BrowserAccessibility* root = GetManager()->GetRoot();
   ASSERT_NE(nullptr, root);
-  ASSERT_EQ(18u, root->PlatformChildCount());
+  ASSERT_EQ(19u, root->PlatformChildCount());
 
   auto TestLocalizedRoleDescription =
       [root](int child_index,
@@ -758,10 +759,11 @@
   TestLocalizedRoleDescription(11, base::ASCIIToUTF16("telephone"));
   TestLocalizedRoleDescription(12, base::ASCIIToUTF16("url"));
   TestLocalizedRoleDescription(13, base::ASCIIToUTF16("week picker"));
-  TestLocalizedRoleDescription(14, base::ASCIIToUTF16("meter"));
-  TestLocalizedRoleDescription(15, base::ASCIIToUTF16("output"));
-  TestLocalizedRoleDescription(16, base::ASCIIToUTF16("time"));
-  TestLocalizedRoleDescription(17, base::ASCIIToUTF16("content information"));
+  TestLocalizedRoleDescription(14, base::ASCIIToUTF16("highlight"));
+  TestLocalizedRoleDescription(15, base::ASCIIToUTF16("meter"));
+  TestLocalizedRoleDescription(16, base::ASCIIToUTF16("output"));
+  TestLocalizedRoleDescription(17, base::ASCIIToUTF16("time"));
+  TestLocalizedRoleDescription(18, base::ASCIIToUTF16("content information"));
 }
 
 IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest,
@@ -803,17 +805,16 @@
                                              ax::mojom::Role::kStaticText);
 
   BrowserAccessibility* mark_node = para_node->PlatformGetChild(1);
-  TestGetStyleNameAttributeAsLocalizedString(
-      mark_node, ax::mojom::Role::kMark,
-      base::ASCIIToUTF16("highlighted content"));
+  TestGetStyleNameAttributeAsLocalizedString(mark_node, ax::mojom::Role::kMark,
+                                             base::ASCIIToUTF16("highlight"));
 
   // Android doesn't always have a child in this case.
   if (mark_node->PlatformChildCount() > 0u) {
     BrowserAccessibility* mark_text_node = mark_node->PlatformGetChild(0);
     ASSERT_EQ(0u, mark_text_node->PlatformChildCount());
-    TestGetStyleNameAttributeAsLocalizedString(
-        mark_text_node, ax::mojom::Role::kStaticText,
-        base::ASCIIToUTF16("highlighted content"));
+    TestGetStyleNameAttributeAsLocalizedString(mark_text_node,
+                                               ax::mojom::Role::kStaticText,
+                                               base::ASCIIToUTF16("highlight"));
   }
 }
 
diff --git a/content/browser/browser_interface_binders.cc b/content/browser/browser_interface_binders.cc
index 6445fc7c..765c6e4 100644
--- a/content/browser/browser_interface_binders.cc
+++ b/content/browser/browser_interface_binders.cc
@@ -21,6 +21,7 @@
 #include "third_party/blink/public/mojom/background_fetch/background_fetch.mojom.h"
 #include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom.h"
 #include "third_party/blink/public/mojom/content_index/content_index.mojom.h"
+#include "third_party/blink/public/mojom/credentialmanager/credential_manager.mojom.h"
 #include "third_party/blink/public/mojom/filesystem/file_system.mojom.h"
 #include "third_party/blink/public/mojom/idle/idle_manager.mojom.h"
 #include "third_party/blink/public/mojom/locks/lock_manager.mojom.h"
@@ -28,6 +29,8 @@
 #include "third_party/blink/public/mojom/presentation/presentation.mojom.h"
 #include "third_party/blink/public/mojom/speech/speech_synthesis.mojom.h"
 #include "third_party/blink/public/mojom/webaudio/audio_context_manager.mojom.h"
+#include "third_party/blink/public/mojom/webauthn/authenticator.mojom.h"
+#include "third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom.h"
 
 #if !defined(OS_ANDROID)
 #include "third_party/blink/public/mojom/hid/hid.mojom.h"
@@ -85,6 +88,16 @@
 
   map->Add<blink::mojom::PushMessaging>(base::BindRepeating(
       &RenderFrameHostImpl::GetPushMessaging, base::Unretained(host)));
+
+  map->Add<blink::mojom::CredentialManager>(base::BindRepeating(
+      &RenderFrameHostImpl::GetCredentialManager, base::Unretained(host)));
+
+  map->Add<blink::mojom::Authenticator>(base::BindRepeating(
+      &RenderFrameHostImpl::GetAuthenticator, base::Unretained(host)));
+
+  map->Add<blink::test::mojom::VirtualAuthenticatorManager>(
+      base::BindRepeating(&RenderFrameHostImpl::GetVirtualAuthenticatorManager,
+                          base::Unretained(host)));
 }
 
 void PopulateBinderMapWithContext(
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index 2c9374b..ad7278ac 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -93,6 +93,7 @@
 #include "third_party/blink/public/mojom/usb/web_usb_service.mojom.h"
 #include "third_party/blink/public/mojom/webaudio/audio_context_manager.mojom-forward.h"
 #include "third_party/blink/public/mojom/webauthn/authenticator.mojom.h"
+#include "third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom.h"
 #include "third_party/blink/public/mojom/websockets/websocket_connector.mojom.h"
 #include "third_party/blink/public/mojom/worker/dedicated_worker_host_factory.mojom.h"
 #include "third_party/blink/public/platform/web_focus_type.h"
@@ -1074,6 +1075,7 @@
 
   void CreateLockManager(
       mojo::PendingReceiver<blink::mojom::LockManager> receiver);
+
   void GetFileChooser(
       mojo::PendingReceiver<blink::mojom::FileChooser> receiver);
 
@@ -1082,6 +1084,15 @@
 
   void CreateWebBluetoothService(
       mojo::PendingReceiver<blink::mojom::WebBluetoothService> receiver);
+  void GetCredentialManager(
+      mojo::PendingReceiver<blink::mojom::CredentialManager> receiver);
+
+  void GetAuthenticator(
+      mojo::PendingReceiver<blink::mojom::Authenticator> receiver);
+
+  void GetVirtualAuthenticatorManager(
+      mojo::PendingReceiver<blink::test::mojom::VirtualAuthenticatorManager>
+          receiver);
 
   void GetPushMessaging(
       mojo::PendingReceiver<blink::mojom::PushMessaging> receiver);
@@ -1596,13 +1607,6 @@
   void GetFrameHostTestInterface(
       mojo::PendingReceiver<blink::mojom::FrameHostTestInterface> receiver)
       override;
-  void GetCredentialManager(
-      mojo::PendingReceiver<blink::mojom::CredentialManager> receiver) override;
-  void GetAuthenticator(
-      mojo::PendingReceiver<blink::mojom::Authenticator> receiver) override;
-  void GetVirtualAuthenticatorManager(
-      mojo::PendingReceiver<blink::test::mojom::VirtualAuthenticatorManager>
-          receiver) override;
 
   // Allows tests to disable the swapout event timer to simulate bugs that
   // happen before it fires (to avoid flakiness).
diff --git a/content/browser/indexed_db/indexed_db_cursor.cc b/content/browser/indexed_db/indexed_db_cursor.cc
index 5a6a120..ebd9add4 100644
--- a/content/browser/indexed_db/indexed_db_cursor.cc
+++ b/content/browser/indexed_db/indexed_db_cursor.cc
@@ -62,8 +62,6 @@
 }
 
 IndexedDBCursor::~IndexedDBCursor() {
-  if (transaction_)
-    transaction_->UnregisterOpenCursor(this);
   // Call to make sure we complete our lifetime trace.
   Close();
 }
@@ -405,6 +403,8 @@
   closed_ = true;
   cursor_.reset();
   saved_cursor_.reset();
+  if (transaction_)
+    transaction_->UnregisterOpenCursor(this);
   transaction_.reset();
 }
 
diff --git a/content/browser/indexed_db/indexed_db_transaction.cc b/content/browser/indexed_db/indexed_db_transaction.cc
index ca2cbe7..c8dba54 100644
--- a/content/browser/indexed_db/indexed_db_transaction.cc
+++ b/content/browser/indexed_db/indexed_db_transaction.cc
@@ -540,9 +540,13 @@
 
 void IndexedDBTransaction::CloseOpenCursors() {
   IDB_TRACE1("IndexedDBTransaction::CloseOpenCursors", "txn.id", id());
-  for (auto* cursor : open_cursors_)
-    cursor->Close();
+
+  // IndexedDBCursor::Close() indirectly mutates |open_cursors_|, when it calls
+  // IndexedDBTransaction::UnregisterOpenCursor().
+  std::set<IndexedDBCursor*> open_cursors = std::move(open_cursors_);
   open_cursors_.clear();
+  for (auto* cursor : open_cursors)
+    cursor->Close();
 }
 
 void IndexedDBTransaction::AddPendingObserver(
diff --git a/content/browser/webauth/webauth_browsertest.cc b/content/browser/webauth/webauth_browsertest.cc
index 6f12380..6eff627 100644
--- a/content/browser/webauth/webauth_browsertest.cc
+++ b/content/browser/webauth/webauth_browsertest.cc
@@ -460,12 +460,11 @@
   }
 
   void ConnectToAuthenticator() {
-    auto* broker = static_cast<blink::mojom::DocumentInterfaceBroker*>(
-        static_cast<RenderFrameHostImpl*>(
-            shell()->web_contents()->GetMainFrame()));
+    auto* render_frame_host_impl = static_cast<RenderFrameHostImpl*>(
+        shell()->web_contents()->GetMainFrame());
     if (authenticator_remote_.is_bound())
       authenticator_remote_.reset();
-    broker->GetAuthenticator(
+    render_frame_host_impl->GetAuthenticator(
         authenticator_remote_.BindNewPipeAndPassReceiver());
   }
 
diff --git a/content/public/test/content_browser_test_utils.h b/content/public/test/content_browser_test_utils.h
index 67c2055..ddfaf61 100644
--- a/content/public/test/content_browser_test_utils.h
+++ b/content/public/test/content_browser_test_utils.h
@@ -70,18 +70,21 @@
 // |url|.  This is a browser-initiated navigation that simulates a user typing
 // |url| into the address bar.
 //
-// TODO(alexmos): any tests that use this function and expect successful
-// navigations should do EXPECT_TRUE(NavigateToURL()).
-bool NavigateToURL(Shell* window, const GURL& url);
+// Tests should ensure that NavigateToURL succeeds.  If the URL that will
+// eventually commit is different from |url|, such as with redirects, use the
+// version below which also takes the expected commit URL.  If the navigation
+// will not result in a commit, such as a download or a 204 response, use
+// NavigateToURLAndExpectNoCommit() instead.
+WARN_UNUSED_RESULT bool NavigateToURL(Shell* window, const GURL& url);
 
 // Same as above, but takes in an additional URL, |expected_commit_url|, to
 // which the navigation should eventually commit.  This is useful for cases
 // like redirects, where navigation starts on one URL but ends up committing a
 // different URL.  This function will return true if navigating to |url|
 // results in a successful commit to |expected_commit_url|.
-bool NavigateToURL(Shell* window,
-                   const GURL& url,
-                   const GURL& expected_commit_url);
+WARN_UNUSED_RESULT bool NavigateToURL(Shell* window,
+                                      const GURL& url,
+                                      const GURL& expected_commit_url);
 
 // Perform a renderer-initiated navigation of |window| to |url|, blocking
 // until the navigation finishes.  The navigation is done by assigning
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 632f4e27..7daa962a 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -938,8 +938,6 @@
     document_state->set_was_alternate_protocol_available(
         head->was_alternate_protocol_available);
     document_state->set_connection_info(head->connection_info);
-    internal_data->set_effective_connection_type(
-        head->effective_connection_type);
   }
 
   bool load_data = !common_params.base_url_for_data_url.is_empty() &&
@@ -1862,8 +1860,6 @@
       handling_select_range_(false),
       render_accessibility_(nullptr),
       previews_state_(PREVIEWS_UNSPECIFIED),
-      effective_connection_type_(
-          blink::WebEffectiveConnectionType::kTypeUnknown),
       is_pasting_(false),
       suppress_further_dialogs_(false),
       blame_context_(nullptr),
@@ -1968,7 +1964,6 @@
       RenderFrameImpl::FromWebFrame(frame_->Parent());
   if (parent_frame) {
     previews_state_ = parent_frame->GetPreviewsState();
-    effective_connection_type_ = parent_frame->GetEffectiveConnectionType();
   }
 
   bool is_tracing_rail = false;
@@ -4738,9 +4733,6 @@
   // change at commit time.
   if (is_main_frame_) {
     previews_state_ = internal_data->previews_state();
-    effective_connection_type_ =
-        EffectiveConnectionTypeToWebEffectiveConnectionType(
-            internal_data->effective_connection_type());
   }
 
   if (previous_routing_id_ != MSG_ROUTING_NONE) {
@@ -5148,16 +5140,6 @@
   Send(new FrameHostMsg_DispatchLoad(routing_id_));
 }
 
-blink::WebEffectiveConnectionType
-RenderFrameImpl::GetEffectiveConnectionType() {
-  return effective_connection_type_;
-}
-
-void RenderFrameImpl::SetEffectiveConnectionTypeForTesting(
-    blink::WebEffectiveConnectionType type) {
-  effective_connection_type_ = type;
-}
-
 blink::WebURLRequest::PreviewsState RenderFrameImpl::GetPreviewsStateForFrame()
     const {
   PreviewsState disabled_state = previews_state_ & kDisabledPreviewsBits;
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 68166c1..36c4e8b 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -89,7 +89,6 @@
 #include "third_party/blink/public/mojom/renderer_preferences.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
 #include "third_party/blink/public/mojom/use_counter/css_property_id.mojom.h"
-#include "third_party/blink/public/platform/web_effective_connection_type.h"
 #include "third_party/blink/public/platform/web_focus_type.h"
 #include "third_party/blink/public/platform/web_loading_behavior_flag.h"
 #include "third_party/blink/public/platform/web_media_player.h"
@@ -775,9 +774,6 @@
   void ForwardResourceTimingToParent(
       const blink::WebResourceTimingInfo& info) override;
   void DispatchLoad() override;
-  blink::WebEffectiveConnectionType GetEffectiveConnectionType() override;
-  void SetEffectiveConnectionTypeForTesting(
-      blink::WebEffectiveConnectionType) override;
   blink::WebURLRequest::PreviewsState GetPreviewsStateForFrame() const override;
   void DidBlockNavigation(const blink::WebURL& blocked_url,
                           const blink::WebURL& initiator_url,
@@ -1637,11 +1633,6 @@
   // LocalFrame or another class around there.
   PreviewsState previews_state_;
 
-  // Effective connection type when the document of this frame was fetched.
-  // TODO(sclittle): Consider moving this into Blink to be owned and managed by
-  // LocalFrame or another class around there.
-  blink::WebEffectiveConnectionType effective_connection_type_;
-
   // Whether or not this RenderFrame is currently pasting.
   bool is_pasting_;
 
diff --git a/content/renderer/render_frame_impl_browsertest.cc b/content/renderer/render_frame_impl_browsertest.cc
index 7c408996..8e851a0f 100644
--- a/content/renderer/render_frame_impl_browsertest.cc
+++ b/content/renderer/render_frame_impl_browsertest.cc
@@ -50,7 +50,6 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/mojom/frame/frame_host_test_interface.mojom.h"
-#include "third_party/blink/public/platform/web_effective_connection_type.h"
 #include "third_party/blink/public/platform/web_runtime_features.h"
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/public/platform/web_url.h"
@@ -158,11 +157,6 @@
     frame->previews_state_ = previews_state;
   }
 
-  void SetEffectionConnectionType(RenderFrameImpl* frame,
-                                  blink::WebEffectiveConnectionType type) {
-    frame->effective_connection_type_ = type;
-  }
-
   TestRenderFrame* GetMainRenderFrame() {
     return static_cast<TestRenderFrame*>(view_->GetMainRenderFrame());
   }
@@ -309,72 +303,6 @@
   EXPECT_TRUE(observer.visible());
 }
 
-// Test that effective connection type only updates for new main frame
-// documents.
-TEST_F(RenderFrameImplTest, EffectiveConnectionType) {
-  EXPECT_EQ(blink::WebEffectiveConnectionType::kTypeUnknown,
-            frame()->GetEffectiveConnectionType());
-  EXPECT_EQ(blink::WebEffectiveConnectionType::kTypeUnknown,
-            GetMainRenderFrame()->GetEffectiveConnectionType());
-
-  const struct {
-    blink::WebEffectiveConnectionType type;
-  } tests[] = {{blink::WebEffectiveConnectionType::kTypeUnknown},
-               {blink::WebEffectiveConnectionType::kType2G},
-               {blink::WebEffectiveConnectionType::kType4G}};
-
-  for (size_t i = 0; i < base::size(tests); ++i) {
-    SetEffectionConnectionType(GetMainRenderFrame(), tests[i].type);
-    SetEffectionConnectionType(frame(), tests[i].type);
-
-    EXPECT_EQ(tests[i].type, frame()->GetEffectiveConnectionType());
-    EXPECT_EQ(tests[i].type,
-              GetMainRenderFrame()->GetEffectiveConnectionType());
-
-    blink::WebHistoryItem item;
-    item.Initialize();
-
-    // The main frame's and subframe's effective connection type should stay the
-    // same on same-document navigations.
-    frame()->DidFinishSameDocumentNavigation(item, blink::kWebStandardCommit,
-                                             false /* content_initiated */);
-    EXPECT_EQ(tests[i].type, frame()->GetEffectiveConnectionType());
-    GetMainRenderFrame()->DidFinishSameDocumentNavigation(
-        item, blink::kWebStandardCommit, false /* content_initiated */);
-    EXPECT_EQ(tests[i].type, frame()->GetEffectiveConnectionType());
-
-    // The subframe's effective connection type should not be reset on commit.
-    NavigationState* navigation_state = NavigationState::FromDocumentLoader(
-        frame()->GetWebFrame()->GetDocumentLoader());
-    navigation_state->set_was_within_same_document(false);
-
-    mojo::PendingRemote<blink::mojom::DocumentInterfaceBroker>
-        stub_document_interface_broker;
-    frame()->DidCommitProvisionalLoad(
-        item, blink::kWebStandardCommit,
-        stub_document_interface_broker.InitWithNewPipeAndPassReceiver()
-            .PassPipe());
-    EXPECT_EQ(tests[i].type, frame()->GetEffectiveConnectionType());
-
-    // The main frame's effective connection type should be reset on commit.
-    navigation_state = NavigationState::FromDocumentLoader(
-        GetMainRenderFrame()->GetWebFrame()->GetDocumentLoader());
-    navigation_state->set_was_within_same_document(false);
-
-    stub_document_interface_broker.reset();
-    GetMainRenderFrame()->DidCommitProvisionalLoad(
-        item, blink::kWebStandardCommit,
-        stub_document_interface_broker.InitWithNewPipeAndPassReceiver()
-            .PassPipe());
-    EXPECT_EQ(blink::WebEffectiveConnectionType::kTypeUnknown,
-              GetMainRenderFrame()->GetEffectiveConnectionType());
-
-    // The subframe would be deleted here after a cross-document navigation.
-    // It happens to be left around in this test because this does not simulate
-    // the frame detach.
-  }
-}
-
 TEST_F(RenderFrameImplTest, SaveImageFromDataURL) {
   const IPC::Message* msg1 = render_thread_->sink().GetFirstMessageMatching(
       FrameHostMsg_SaveImageFromDataURL::ID);
@@ -784,13 +712,6 @@
       override {
     binder_callback_.Run(std::move(receiver));
   }
-  void GetCredentialManager(
-      mojo::PendingReceiver<blink::mojom::CredentialManager>) override {}
-  void GetAuthenticator(
-      mojo::PendingReceiver<blink::mojom::Authenticator> receiver) override {}
-  void GetVirtualAuthenticatorManager(
-      mojo::PendingReceiver<blink::test::mojom::VirtualAuthenticatorManager>
-          receiver) override {}
 
   mojo::Receiver<blink::mojom::DocumentInterfaceBroker> receiver_{this};
   BinderCallback binder_callback_;
diff --git a/content/shell/test_runner/event_sender.cc b/content/shell/test_runner/event_sender.cc
index 99331de..16e6588 100644
--- a/content/shell/test_runner/event_sender.cc
+++ b/content/shell/test_runner/event_sender.cc
@@ -1818,22 +1818,37 @@
 
 void EventSender::ZoomPageIn() {
   for (WebViewTestProxy* view_proxy : interfaces()->GetWindowList()) {
-    view_proxy->GetWidget()->SetZoomLevelForTesting(
-        view_proxy->webview()->ZoomLevel() + 1);
+    // Only set page zoom on main frames. Any RenderViews that exist for
+    // a proxy main frame will hear about the change as a side effect of
+    // changing the main frame.
+    if (view_proxy->GetMainRenderFrame()) {
+      view_proxy->GetWidget()->SetZoomLevelForTesting(
+          view_proxy->webview()->ZoomLevel() + 1);
+    }
   }
 }
 
 void EventSender::ZoomPageOut() {
   for (WebViewTestProxy* view_proxy : interfaces()->GetWindowList()) {
-    view_proxy->GetWidget()->SetZoomLevelForTesting(
-        view_proxy->webview()->ZoomLevel() - 1);
+    // Only set page zoom on main frames. Any RenderViews that exist for
+    // a proxy main frame will hear about the change as a side effect of
+    // changing the main frame.
+    if (view_proxy->GetMainRenderFrame()) {
+      view_proxy->GetWidget()->SetZoomLevelForTesting(
+          view_proxy->webview()->ZoomLevel() - 1);
+    }
   }
 }
 
 void EventSender::SetPageZoomFactor(double zoom_factor) {
   for (WebViewTestProxy* view_proxy : interfaces()->GetWindowList()) {
-    view_proxy->GetWidget()->SetZoomLevelForTesting(std::log(zoom_factor) /
-                                                    std::log(1.2));
+    // Only set page zoom on main frames. Any RenderViews that exist for
+    // a proxy main frame will hear about the change as a side effect of
+    // changing the main frame.
+    if (view_proxy->GetMainRenderFrame()) {
+      view_proxy->GetWidget()->SetZoomLevelForTesting(std::log(zoom_factor) /
+                                                      std::log(1.2));
+    }
   }
 }
 
diff --git a/content/test/data/accessibility/html/mark-expected-mac.txt b/content/test/data/accessibility/html/mark-expected-mac.txt
index c275b85..69896cd 100644
--- a/content/test/data/accessibility/html/mark-expected-mac.txt
+++ b/content/test/data/accessibility/html/mark-expected-mac.txt
@@ -1,6 +1,6 @@
 AXWebArea AXRoleDescription='HTML content'
 ++AXGroup AXRoleDescription='group'
 ++++AXStaticText AXRoleDescription='text' AXValue='This test is to check '
-++++AXGroup AXRoleDescription='highlighted content'
+++++AXGroup AXRoleDescription='highlight'
 ++++++AXStaticText AXRoleDescription='text' AXValue='mark tag'
 ++++AXStaticText AXRoleDescription='text' AXValue='.'
diff --git a/content/test/data/accessibility/html/mark-expected-uia-win.txt b/content/test/data/accessibility/html/mark-expected-uia-win.txt
index ae2b0eb4..95f8ba6 100644
--- a/content/test/data/accessibility/html/mark-expected-uia-win.txt
+++ b/content/test/data/accessibility/html/mark-expected-uia-win.txt
@@ -1,6 +1,6 @@
 document
 ++group
 ++++description Name='This test is to check '
-++++description
+++++description LocalizedControlType='highlight'
 ++++++description Name='mark tag'
 ++++description Name='.'
diff --git a/content/test/data/accessibility/html/mark-expected-win.txt b/content/test/data/accessibility/html/mark-expected-win.txt
index 03e6f81..6209269 100644
--- a/content/test/data/accessibility/html/mark-expected-win.txt
+++ b/content/test/data/accessibility/html/mark-expected-win.txt
@@ -1,6 +1,6 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
 ++IA2_ROLE_PARAGRAPH
 ++++ROLE_SYSTEM_STATICTEXT name='This test is to check '
-++++IA2_ROLE_TEXT_FRAME
+++++IA2_ROLE_TEXT_FRAME localized_extended_role='highlight'
 ++++++ROLE_SYSTEM_STATICTEXT name='mark tag'
 ++++ROLE_SYSTEM_STATICTEXT name='.'
diff --git a/content/test/data/accessibility/html/mark.html b/content/test/data/accessibility/html/mark.html
index 0ec7cdc..55ed2b55 100644
--- a/content/test/data/accessibility/html/mark.html
+++ b/content/test/data/accessibility/html/mark.html
@@ -1,5 +1,7 @@
 <!--
 @MAC-ALLOW:AXRole*
+@UIA-WIN-ALLOW:LocalizedControlType='highlight'
+@WIN-ALLOW:localized_extended_role='highlight'
 -->
 <!DOCTYPE html>
 <html>
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
index 32a8bc37..5d1c612 100644
--- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -234,7 +234,6 @@
 crbug.com/969864 [ android skia-renderer use-gl no-use-vulkan ] Pixel_Video_MP4_FourColors_Rot_180 [ Skip ]
 crbug.com/969864 [ android skia-renderer use-gl no-use-vulkan ] Pixel_Video_MP4_FourColors_Rot_270 [ Skip ]
 crbug.com/969864 [ android skia-renderer use-gl no-use-vulkan ] Pixel_Video_MP4_FourColors_Rot_90 [ Skip ]
-crbug.com/969864 [ android skia-renderer use-gl no-use-vulkan ] Pixel_Video_MP4_Rounded_Corner [ Skip ]
 crbug.com/969864 [ android skia-renderer use-gl no-use-vulkan ] Pixel_Video_VP9 [ Skip ]
 crbug.com/969864 [ android skia-renderer use-gl no-use-vulkan ] Pixel_WebGL2_BlitFramebuffer_Result_Displayed [ Skip ]
 
@@ -261,5 +260,5 @@
 # Producing incorrect image on Win10 Intel HD 630 w/ 26.20.100.6912 drivers.
 crbug.com/997313 [ win intel-0x5912 ] Pixel_WebGL_PremultipliedAlpha_False [ Failure ]
 
-# Rounded corner pixel test fails on Android vulkan.
-crbug.com/1007019 [ android skia-renderer use-vulkan ] Pixel_Video_MP4_Rounded_Corner [ Failure ]
+# Rounded corner pixel test fails on Android SkiaRenderer.
+crbug.com/1007019 [ android skia-renderer ] Pixel_Video_MP4_Rounded_Corner [ Skip ]
diff --git a/extensions/browser/extension_navigation_throttle.cc b/extensions/browser/extension_navigation_throttle.cc
index cf0d59f..8909eee9 100644
--- a/extensions/browser/extension_navigation_throttle.cc
+++ b/extensions/browser/extension_navigation_throttle.cc
@@ -133,9 +133,6 @@
   const url::Origin& initiator_origin =
       navigation_handle()->GetInitiatorOrigin().value();
 
-  // TODO(lukasza): https://crbug.com/1003957: Get rid of duplication with
-  // ChromeContentBrowserClientExtensionsPart::ShouldAllowOpenURL.
-
   // Navigations from chrome://, devtools:// or chrome-search:// pages need to
   // be allowed, even if the target |url| is not web-accessible.  See
   // https://crbug.com/662602.
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc
index c174d9e..232bce3 100644
--- a/extensions/renderer/dispatcher.cc
+++ b/extensions/renderer/dispatcher.cc
@@ -558,9 +558,10 @@
     int64_t service_worker_version_id,
     const GURL& service_worker_scope,
     const GURL& script_url) {
-  if (!ExtensionsRendererClient::Get()
-           ->ExtensionAPIEnabledForServiceWorkerScript(service_worker_scope,
-                                                       script_url)) {
+  // Note that using ExtensionAPIEnabledForServiceWorkerScript() won't work here
+  // as RendererExtensionRegistry might have already unloaded this extension.
+  // Use the existence of ServiceWorkerData as the source of truth instead.
+  if (!WorkerThreadDispatcher::GetServiceWorkerData()) {
     // If extension APIs in service workers aren't enabled, we just need to
     // remove the context.
     g_worker_script_context_set.Get().Remove(v8_context, script_url);
diff --git a/extensions/renderer/worker_thread_dispatcher.cc b/extensions/renderer/worker_thread_dispatcher.cc
index 3b1f9ac..ec56597f 100644
--- a/extensions/renderer/worker_thread_dispatcher.cc
+++ b/extensions/renderer/worker_thread_dispatcher.cc
@@ -35,6 +35,12 @@
 base::LazyInstance<base::ThreadLocalPointer<extensions::ServiceWorkerData>>::
     DestructorAtExit g_data_tls = LAZY_INSTANCE_INITIALIZER;
 
+ServiceWorkerData* GetServiceWorkerDataChecked() {
+  ServiceWorkerData* data = WorkerThreadDispatcher::GetServiceWorkerData();
+  DCHECK(data);
+  return data;
+}
+
 }  // namespace
 
 WorkerThreadDispatcher::WorkerThreadDispatcher() {}
@@ -54,24 +60,22 @@
 
 // static
 NativeExtensionBindingsSystem* WorkerThreadDispatcher::GetBindingsSystem() {
-  return GetServiceWorkerData()->bindings_system();
+  return GetServiceWorkerDataChecked()->bindings_system();
 }
 
 // static
 V8SchemaRegistry* WorkerThreadDispatcher::GetV8SchemaRegistry() {
-  return GetServiceWorkerData()->v8_schema_registry();
+  return GetServiceWorkerDataChecked()->v8_schema_registry();
 }
 
 // static
 ScriptContext* WorkerThreadDispatcher::GetScriptContext() {
-  return GetServiceWorkerData()->context();
+  return GetServiceWorkerDataChecked()->context();
 }
 
 // static
 ServiceWorkerData* WorkerThreadDispatcher::GetServiceWorkerData() {
-  ServiceWorkerData* data = g_data_tls.Pointer()->Get();
-  DCHECK(data);
-  return data;
+  return g_data_tls.Pointer()->Get();
 }
 
 // static
diff --git a/fuchsia/engine/context_provider_impl.cc b/fuchsia/engine/context_provider_impl.cc
index a992551..8f5b6f6 100644
--- a/fuchsia/engine/context_provider_impl.cc
+++ b/fuchsia/engine/context_provider_impl.cc
@@ -227,10 +227,6 @@
                                      gl::kGLImplementationStubName);
   }
 
-  if (enable_protected_graphics) {
-    launch_command.AppendSwitch(switches::kEnforceVulkanProtectedMemory);
-  }
-
   if (enable_widevine) {
     launch_command.AppendSwitch(switches::kEnableWidevine);
   }
diff --git a/gpu/command_buffer/service/shared_image_video.cc b/gpu/command_buffer/service/shared_image_video.cc
index dcee3a7..c6a25df8 100644
--- a/gpu/command_buffer/service/shared_image_video.cc
+++ b/gpu/command_buffer/service/shared_image_video.cc
@@ -329,8 +329,8 @@
         LOG(ERROR) << "Failed to get the hardware buffer.";
         return nullptr;
       }
+      DCHECK(scoped_hardware_buffer_->buffer());
     }
-    DCHECK(scoped_hardware_buffer_->buffer());
 
     // Wait on the sync fd attached to the buffer to make sure buffer is
     // ready before the read. This is done by inserting the sync fd semaphore
diff --git a/gpu/config/gpu_finch_features.cc b/gpu/config/gpu_finch_features.cc
index 0085e38..ddb2ed7 100644
--- a/gpu/config/gpu_finch_features.cc
+++ b/gpu/config/gpu_finch_features.cc
@@ -37,7 +37,7 @@
 // and using overlays on Android.
 // Note that the feature only works with VizDisplayCompositor enabled.
 const base::Feature kAndroidSurfaceControl{"AndroidSurfaceControl",
-                                           base::FEATURE_DISABLED_BY_DEFAULT};
+                                           base::FEATURE_ENABLED_BY_DEFAULT};
 #endif
 
 // Enable GPU Rasterization by default. This can still be overridden by
diff --git a/gpu/ipc/client/gpu_channel_host.cc b/gpu/ipc/client/gpu_channel_host.cc
index d571329..f3d123e 100644
--- a/gpu/ipc/client/gpu_channel_host.cc
+++ b/gpu/ipc/client/gpu_channel_host.cc
@@ -98,10 +98,18 @@
   bool signaled =
       pending_sync.done_event->TimedWait(kGpuChannelHostMaxWaitTime);
 
+  base::TimeDelta wait_duration = base::TimeTicks::Now() - start_time;
+
   // Histogram of wait-for-sync time, used for monitoring the GPU watchdog.
-  UMA_HISTOGRAM_CUSTOM_TIMES(
-      "GPU.GPUChannelHostWaitTime", base::TimeTicks::Now() - start_time,
-      base::TimeDelta::FromSeconds(1), kGpuChannelHostMaxWaitTime, 50);
+  UMA_HISTOGRAM_CUSTOM_TIMES("GPU.GPUChannelHostWaitTime", wait_duration,
+                             base::TimeDelta::FromSeconds(1),
+                             kGpuChannelHostMaxWaitTime, 50);
+
+  // Histogram to measure how long the browser UI thread spends blocked.
+  UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
+      "GPU.GPUChannelHostWaitTime.MicroSeconds", wait_duration,
+      base::TimeDelta::FromMicroseconds(10), base::TimeDelta::FromSeconds(10),
+      50);
 
   // Continue waiting for the event if not signaled
   if (!signaled)
diff --git a/infra/config/cr-buildbucket.cfg b/infra/config/cr-buildbucket.cfg
index 0ce36e2..6a1ac19 100644
--- a/infra/config/cr-buildbucket.cfg
+++ b/infra/config/cr-buildbucket.cfg
@@ -1179,7 +1179,7 @@
     }
 
     builders {
-      name: "Android WebView O NetworkService (dbg)"
+      name: "Android WebView P FYI (rel)"
       mixins: "android-fyi-ci"
       mixins: "builderless"
       mixins: "goma-rbe-prod"
@@ -4116,6 +4116,12 @@
     }
     builders {
       mixins: "android-try"
+      name: "android-webview-pie-arm64-fyi-rel"
+      mixins: "linux-xenial"
+      mixins: "builderless"
+    }
+    builders {
+      mixins: "android-try"
       mixins: "goma-j300"
       name: "android_arm64_dbg_recipe"
       mixins: "linux-xenial"
diff --git a/infra/config/luci-milo.cfg b/infra/config/luci-milo.cfg
index dd86dce..a22e54d 100644
--- a/infra/config/luci-milo.cfg
+++ b/infra/config/luci-milo.cfg
@@ -1643,9 +1643,9 @@
     category: "Memory"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Android WebView O NetworkService (dbg)"
+    name: "buildbucket/luci.chromium.ci/Android WebView P FYI (rel)"
     category: "webview"
-    short_name: "ns"
+    short_name: "p-rel"
   }
   builders {
     name: "buildbucket/luci.chromium.ci/android-marshmallow-x86-fyi-rel"
@@ -2974,9 +2974,9 @@
     short_name: "o"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Android WebView O NetworkService (dbg)"
-    category: "week2c|android|dbg|webview"
-    short_name: "o net"
+    name: "buildbucket/luci.chromium.ci/Android WebView P FYI (rel)"
+    category: "week2c|android|rel|webview"
+    short_name: "p"
   }
   builders {
     name: "buildbucket/luci.chromium.ci/Dawn Linux x64 Builder"
@@ -4415,6 +4415,9 @@
     name: "buildbucket/luci.chromium.try/android-pie-arm64-rel"
   }
   builders {
+    name: "buildbucket/luci.chromium.try/android-webview-pie-arm64-fyi-rel"
+  }
+  builders {
     name: "buildbucket/luci.chromium.try/android_optional_gpu_tests_rel"
   }
   builders {
@@ -5088,6 +5091,9 @@
     name: "buildbucket/luci.chromium.try/android-pie-arm64-rel"
   }
   builders {
+    name: "buildbucket/luci.chromium.try/android-webview-pie-arm64-fyi-rel"
+  }
+  builders {
     name: "buildbucket/luci.chromium.try/android_archive_rel_ng"
   }
   builders {
diff --git a/infra/config/luci-scheduler.cfg b/infra/config/luci-scheduler.cfg
index f4bf601..74c3b90a 100644
--- a/infra/config/luci-scheduler.cfg
+++ b/infra/config/luci-scheduler.cfg
@@ -69,6 +69,7 @@
   triggers: "ASan Release Media (32-bit x86 with V8-ARM)"
   triggers: "Afl Upload Linux ASan"
   triggers: "Android ASAN (dbg)"
+  triggers: "Android WebView P FYI (rel)"
   triggers: "android-archive-dbg-goma-canary"
   triggers: "android-archive-dbg-goma-latest"
   triggers: "android-archive-dbg-goma-rbe-canary"
@@ -690,13 +691,12 @@
 }
 
 job {
-  id: "Android WebView O NetworkService (dbg)"
-  # triggered by "Android arm64 Builder (dbg)"
-  acl_sets: "triggered-by-parent-builders"
+  id: "Android WebView P FYI (rel)"
+  acl_sets: "default"
   buildbucket: {
     server: "cr-buildbucket.appspot.com"
     bucket: "luci.chromium.ci"
-    builder: "Android WebView O NetworkService (dbg)"
+    builder: "Android WebView P FYI (rel)"
   }
 }
 
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb
index 5d71809..de3050b4 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb
@@ -21,12 +21,10 @@
 <translation id="3256316712990552818">ወደ Chromium ተቀድቷል</translation>
 <translation id="3605252743693911722">የእርስዎን ዕልባቶች፣ የይለፍ ቃላት እና በሁሉም የእርስዎ መሣሪያዎች ላይ ተጨማሪ ለማግኘት ወደ Chromium በመለያ ይግቡ።</translation>
 <translation id="3805899903892079518">Chromium የእርስዎ ፎቶዎች ወይም ቪዲዮዎች መዳረሻ የለውም። በiOS ቅንብሮች &gt; ግላዊነት &gt; ፎቶዎች ውስጥ መዳረሻን ያንቁ።</translation>
-<translation id="4241912885070669028">በ<ph name="SIGNOUT_MANAGED_DOMAIN" /> ከሚተዳደር መለያ ዘግተው እየወጡ ነው። ይሄ Chromium ውሂብዎን ከዚህ መሣሪያ ይሰርዘዋል፣ ነገር ግን ውሂብዎ አሁንም በእርስዎ የGoogle መለያ ውስጥ እንዳለ ይቆያል።</translation>
 <translation id="4555020257205549924">ይህ ባህሪ ሲበራ Chromium በሌሎች ቋንቋዎች የተጻፉ ገጾች Google ትርጉምን በመጠቀም እንዲተረጎምልዎ ይጠይቀዎታል። <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">የChromium ቃኚን ያብሩ</translation>
 <translation id="4787850887676698916">በሌሎች መሣሪያዎችዎ ላይ ባለ Chromium ላይ የከፈቷቸው ትሮች እዚህ ይመጣሉ።</translation>
 <translation id="4999538639245140991">በ<ph name="SIGNOUT_MANAGED_DOMAIN" /> ከሚተዳደር መለያ ዘግተው እየወጡ ስለሆነ የእርስዎ Chromium ውሂብ ከዚህ መሣሪያ ላይ ይሰረዛል። የእርስዎ ውሂብ በGoogle መለያዎ ውስጥ ይቆያል።</translation>
-<translation id="5231355151045086930">ከChromium ዘግተው ይውጡ</translation>
 <translation id="5862307444128926510">ወደ Chromium እንኳን በደህና መጡ</translation>
 <translation id="5945387852661427312">በ<ph name="DOMAIN" /> ከሚተዳደር መለያ ዘግተው እየወጡና ለአስተዳዳሪው ሙሉውን በChromium ውሂብዎ ቁጥጥር እየሰጡ ነው። የእርስዎ ውሂብ እስከመጨረሻው ከዚህ መለያ ጋር ይተሳሰራል። ከChromium ዘግቶ መውጣት ውሂብዎን ከዚህ መሣሪያ ይሰርዘዋል፣ ነገር ግን በእርስዎ Google መለያ ላይ እንደተከማቸ ይቆያል።</translation>
 <translation id="6068866989048414399">የChromium አገልግሎት ውል</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
index 200d1f0f..d76a63b 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">‏تم النسخ إلى Chromium</translation>
 <translation id="3605252743693911722">‏سجّل الدخول إلى Chromium للحصول غلى الإشارات المرجعية وكلمات المرور والمزيد على جميع أجهزتك.</translation>
 <translation id="3805899903892079518">‏لا تتوفر لدى Chromium إمكانية الدخول إلى الصور أو الفيديوهات. تستطيع تفعيل الدخول في إعدادات نظام التشغيل iOS &gt; الخصوصية &gt; الصور.</translation>
-<translation id="4241912885070669028">‏أنت بصدد الخروج من حساب تتم إدارته من خلال <ph name="SIGNOUT_MANAGED_DOMAIN" />. سيؤدي ذلك إلى حذف بيانات Chromium من هذا الجهاز، ولكن ستظل البيانات في حسابك في Google.</translation>
 <translation id="4555020257205549924">‏عند تشغيل هذه الميزة، سيقترح Chromium ترجمة الصفحات المكتوبة بلغات أخرى باستخدام "ترجمة Google". <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">‏تفعيل الماسح الضوئي في Chromium</translation>
 <translation id="4787850887676698916">‏ستظهر علامات التبويب التي فتحتها في Chromium على أجهزتك الأخرى هنا.</translation>
 <translation id="4999538639245140991">‏نظرًا لتسجيل خروجك من حساب يديره <ph name="SIGNOUT_MANAGED_DOMAIN" />، ستُحذَف بيانات Chromium من هذا الجهاز، ولكن ستظل البيانات محفوظة في حسابك على Google.</translation>
-<translation id="5231355151045086930">‏الخروج من Chromium</translation>
 <translation id="5862307444128926510">‏مرحبًا بك في Chromium</translation>
 <translation id="5945387852661427312">‏إنك تسجل الدخول باستخدام حساب تتم إدارته من خلال <ph name="DOMAIN" /> وتمنح مشرفه الحق في التحكم في بياناتك على Chromium. سيؤدي ذلك إلى جعل بياناتك مرتبطة دائمًا بهذا الحساب. كما سيؤدي الخروج من Chromium إلى حذف بياناتك من هذا الجهاز، ولكن ستظل هذه البيانات مخزَّنة على حسابك في Google.</translation>
 <translation id="6068866989048414399">‏بنود خدمة Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_bg.xtb
index 006a5ee..7773d1a 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_bg.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_bg.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Копирано в Chromium</translation>
 <translation id="3605252743693911722">Влезте в Chromium, за да получите отметките, паролите и другите си неща на всичките си устройства.</translation>
 <translation id="3805899903892079518">Chromium няма достъп до снимките или видеоклиповете ви. Активирайте го от „Settings“ &gt; „Privacy“ &gt; „Photos“ в iOS.</translation>
-<translation id="4241912885070669028">Излизате от профил, управляван от <ph name="SIGNOUT_MANAGED_DOMAIN" />. Данните ви в Chromium ще се изтрият от това устройство, но ще останат в профила ви в Google.</translation>
 <translation id="4555020257205549924">Когато тази функция е включена, Chromium ще предлага да преведе страниците, написани на други езици, посредством Google Преводач. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Включване на скенера в Chromium</translation>
 <translation id="4787850887676698916">Тук ще се показват разделите, които сте отворили в Chromium на другите си устройства.</translation>
 <translation id="4999538639245140991">Тъй като излизате от профил, управляван от <ph name="SIGNOUT_MANAGED_DOMAIN" />, данните ви в Chromium ще бъдат изтрити от това устройство, но ще останат в профила ви в Google.</translation>
-<translation id="5231355151045086930">Изход от Chromium</translation>
 <translation id="5862307444128926510">Добре дошли в Chromium</translation>
 <translation id="5945387852661427312">Влизате с профил, управляван от <ph name="DOMAIN" />, и предоставяте на администратора му контрол над данните си в Chromium. Те ще се свържат за постоянно с този профил. При излизане от браузъра информацията ви ще се изтрие от устройството, но ще продължи да се съхранява в профила ви в Google.</translation>
 <translation id="6068866989048414399">Общи условия на Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_bn.xtb
index ebd1d07..fd8e47d6 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_bn.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_bn.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Chromium-এ প্রতিলিপি করা হয়েছে</translation>
 <translation id="3605252743693911722">আপনার বুকমার্ক, পাসওয়ার্ড এবং অন্যান্য জিনিস আপনার সমস্ত ডিভাইসে পেতে Chromium-এ সাইন-ইন করুন।</translation>
 <translation id="3805899903892079518">আপনার ফটো এবং ভিডিওগুলিতে Chromium এর অ্যাক্সেস নেই৷ iOS সেটিংস &gt; গোপনীয়তা &gt; ফটোগুলিতে অ্যাক্সেস সক্ষম করুন৷</translation>
-<translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" /> পরিচালিত একটি অ্যাকাউন্ট থেকে আপনি সাইন-আউট করছেন৷ এটি এই ডিভাইস থেকে আপনার Chromium ডেটা মুছে ফেলবে, কিন্তু আপনার Google অ্যাকাউন্টে ডেটা থেকে যাবে৷</translation>
 <translation id="4555020257205549924">যখন এই বৈশিষ্ট্যটি চালু করা হয় তখন Chromium, Google অনুবাদ ব্যবহার করে অন্যান্য ভাষায় লিখিত পৃষ্ঠাগুলি অনুবাদ করার অফার করবে৷ <ph name="BEGIN_LINK" />আরও জানুন<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Chromium স্ক্যানার চালু করুন</translation>
 <translation id="4787850887676698916">আপনার অন্য ডিভাইসগুলিতে Chromium এ আপনি যে ট্যাবগুলি খুলেছেন সেগুলি এখানে দেখা যাবে।</translation>
 <translation id="4999538639245140991"><ph name="SIGNOUT_MANAGED_DOMAIN" /> দ্বারা ম্যানেজ করা একটি অ্যাকাউন্ট থেকে আপনি সাইন-আউট করছেন বলে, এই ডিভাইস থেকে আপনার Chromium ডেটা মুছে যাবে। আপনার Google অ্যাকাউন্টে এই ডেটা থেকে যাবে।</translation>
-<translation id="5231355151045086930">Chromium থেকে সাইন-আউট করুন</translation>
 <translation id="5862307444128926510">Chromium-এ স্বাগতম</translation>
 <translation id="5945387852661427312">আপনি <ph name="DOMAIN" /> পরিচালিত একটি অ্যাকাউন্টের মাধ্যমে সাইন-ইন করছেন এবং এর অ্যাডমিনিস্ট্রেটরকে আপনার Chromium ডেটা নিয়ন্ত্রণ করতে দিচ্ছেন৷ আপনার ডেটা এই অ্যাকাউন্টের সাথে স্থায়ীভাবে আবদ্ধ হবে৷ Chromium থেকে সাইন-আউট করলে এই ডিভাইস থেকে আপনার ডেটা মুছে ফেলা হবে, কিন্তু এটি আপনার Google অ্যাকাউন্টে সঞ্চিত থাকবে।</translation>
 <translation id="6068866989048414399">Chromium পরিষেবার শর্তাদি</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ca.xtb
index 5e9cf5f..6cdbc1fd 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ca.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ca.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Copiada a Chromium</translation>
 <translation id="3605252743693911722">Inicia la sessió a Chromium per accedir a les teves adreces d'interès, les contrasenyes i altres continguts des de tots els teus dispositius.</translation>
 <translation id="3805899903892079518">Chromium no té accés als vostres vídeos o fotos. Permeteu-li l'accés a iOS, a Configuració &gt; Privadesa &gt; Fotos.</translation>
-<translation id="4241912885070669028">Estàs tancant la sessió d'un compte gestionat per <ph name="SIGNOUT_MANAGED_DOMAIN" />. Se suprimiran les teves dades de Chromium d'aquest dispositiu, però continuaran al teu compte de Google.</translation>
 <translation id="4555020257205549924">Quan aquesta funció està activada, Chromium ofereix la possibilitat de traduir pàgines escrites en altres idiomes mitjançant el Traductor de Google. <ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Activa l'escàner de Chromium</translation>
 <translation id="4787850887676698916">Les pestanyes que tinguis obertes a Chromium als altres dispositius es mostraran aquí.</translation>
 <translation id="4999538639245140991">Com que estàs tancant la sessió d'un compte gestionat per <ph name="SIGNOUT_MANAGED_DOMAIN" />, se suprimiran les teves dades de Chromium d'aquest dispositiu, però continuaran emmagatzemades al teu Compte de Google.</translation>
-<translation id="5231355151045086930">Tanca la sessió de Chromium</translation>
 <translation id="5862307444128926510">Us donem la benvinguda a Chromium</translation>
 <translation id="5945387852661427312">Estàs iniciant la sessió amb un compte gestionat per <ph name="DOMAIN" /> i estàs donant a l'administrador el control de les teves dades de Chromium. Les dades passaran a estar vinculades a aquest compte permanentment. Si tanques la sessió de Chromium, se suprimiran les teves dades d'aquest dispositiu, però continuaran emmagatzemades al teu compte de Google.</translation>
 <translation id="6068866989048414399">Condicions del servei de Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_cs.xtb
index 6305ce6..6452cdb 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_cs.xtb
@@ -21,12 +21,10 @@
 <translation id="3256316712990552818">Zkopírováno do prohlížeče Chromium</translation>
 <translation id="3605252743693911722">Chcete-li mít své záložky, hesla a další obsah na všech zařízeních, přihlaste se do prohlížeče Chromium.</translation>
 <translation id="3805899903892079518">Chromium nemá přístup k vašim fotkám nebo videím. Povolte přístup v systému iOS v Nastavení &gt; Soukromí &gt; Fotky.</translation>
-<translation id="4241912885070669028">Odhlašujete se z účtu, který je spravován doménou <ph name="SIGNOUT_MANAGED_DOMAIN" />. Touto akcí svá data prohlížeče Chromium smažete z tohoto zařízení, ve vašem účtu Google však zůstanou.</translation>
 <translation id="4555020257205549924">Pokud je tato funkce zapnutá, bude Chromium nabízet překlad stránek v jiných jazycích pomocí Překladače Google.<ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Zapněte čtečku prohlížeče Chromium</translation>
 <translation id="4787850887676698916">Zde se objeví karty, které jste otevřeli v prohlížeči Chromium ve svých ostatních zařízeních.</translation>
 <translation id="4999538639245140991">Protože se odhlašujete z účtu spravovaného doménou <ph name="SIGNOUT_MANAGED_DOMAIN" />, vaše data prohlížeče Chromium z tohoto zařízení budou smazána. V účtu Google vám zůstanou.</translation>
-<translation id="5231355151045086930">Odhlášení z prohlížeče Chromium</translation>
 <translation id="5862307444128926510">Vítejte v prohlížeči Chromium</translation>
 <translation id="5945387852661427312">Přihlašujete se pomocí účtu spravovaného doménou <ph name="DOMAIN" /> a poskytujete jeho správci kontrolu nad svými daty prohlížeče Chromium. Vaše data budou trvale přidružena k tomuto účtu. Odhlášením z prohlížeče Chromium svá data smažete z tohoto zařízení, ve vašem účtu Google však uložena zůstanou.</translation>
 <translation id="6068866989048414399">Smluvní podmínky prohlížeče Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_da.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_da.xtb
index 01f0f345..b6499db 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_da.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Kopieret til Chromium</translation>
 <translation id="3605252743693911722">Log ind på Chromium for at få dine bogmærker, adgangskoder og meget mere på alle dine enheder.</translation>
 <translation id="3805899903892079518">Chromium har ikke adgang til dine billeder eller videoer. Gå til iOS Indstillinger &gt; Privatliv &gt; Billeder for at få adgang.</translation>
-<translation id="4241912885070669028">Du er ved at logge ud af en konto, der administreres af <ph name="SIGNOUT_MANAGED_DOMAIN" />. Denne handling sletter dine Chromium-data fra denne enhed, men dine data forbliver gemt på din Google-konto.</translation>
 <translation id="4555020257205549924">Når denne funktion er aktiveret, vil Chromium tilbyde at oversætte sider, der er skrevet på andre sprog, ved hjælp af Google Oversæt. <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Aktivér Chromium-scanner</translation>
 <translation id="4787850887676698916">Faner, du har åbnet i Chromium på dine andre enheder, vises her.</translation>
 <translation id="4999538639245140991">Da du er ved at logge ud af en konto, der administreres af <ph name="SIGNOUT_MANAGED_DOMAIN" />, slettes dine Chromium-data på denne enhed. Dine data forbliver på din Google-konto.</translation>
-<translation id="5231355151045086930">Log ud af Chromium</translation>
 <translation id="5862307444128926510">Velkommen til Chromium</translation>
 <translation id="5945387852661427312">Du er ved at logge ind med en konto, der administreres af <ph name="DOMAIN" />, hvilket giver administratoren kontrol over dine Chromium-data. Dine data tilknyttes denne konto permanent. Hvis du logger ud af Chromium, slettes dine data fra denne enhed, men de forbliver gemt på din Google-konto.</translation>
 <translation id="6068866989048414399">Chromium Servicevilkår</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_de.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_de.xtb
index 0e0d6a2..a0cac702 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_de.xtb
@@ -21,12 +21,10 @@
 <translation id="3256316712990552818">In Chromium kopiert</translation>
 <translation id="3605252743693911722">Melden Sie sich in Chromium an, um Daten wie Lesezeichen und Passwörter auf allen Ihren Geräten zu nutzen.</translation>
 <translation id="3805899903892079518">Chromium hat keinen Zugriff auf Ihre Fotos und Videos. Aktivieren Sie den Zugriff unter "iOS-Einstellungen &gt; Datenschutz &gt; Fotos".</translation>
-<translation id="4241912885070669028">Sie melden sich von einem Konto ab, das von <ph name="SIGNOUT_MANAGED_DOMAIN" /> verwaltet wird. Dadurch werden Ihre Chromium-Daten von diesem Gerät gelöscht, bleiben jedoch in Ihrem Google-Konto erhalten.</translation>
 <translation id="4555020257205549924">Wenn diese Funktion aktiviert ist, haben Sie in Chromium die Möglichkeit, Seiten in anderen Sprachen mithilfe von Google Übersetzer zu übersetzen. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Chromium-Scanner aktivieren</translation>
 <translation id="4787850887676698916">Hier werden Tabs angezeigt, die Sie auf Ihren anderen Geräten in Chromium geöffnet haben.</translation>
 <translation id="4999538639245140991">Sie melden sich von einem Konto ab, das von <ph name="SIGNOUT_MANAGED_DOMAIN" /> verwaltet wird. Dadurch werden Ihre Chromium-Daten von diesem Gerät gelöscht. Sie bleiben jedoch in Ihrem Google-Konto erhalten.</translation>
-<translation id="5231355151045086930">Von Chromium abmelden</translation>
 <translation id="5862307444128926510">Willkommen bei Chromium</translation>
 <translation id="5945387852661427312">Sie melden sich mit einem von <ph name="DOMAIN" /> verwalteten Konto an und geben dem Administrator der Domain Kontrolle über Ihre Chromium-Daten. Die Daten werden diesem Konto dauerhaft zugeordnet. Wenn Sie sich von Chromium abmelden, werden Ihre Daten auf dem Gerät gelöscht, bleiben jedoch in Ihrem Google-Konto erhalten.</translation>
 <translation id="6068866989048414399">Chromium-Nutzungsbedingungen</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb
index 36681f12..bfb3205 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Αντιγράφηκε στο Chromium</translation>
 <translation id="3605252743693911722">Συνδεθείτε στο Chromium, για να έχετε τους σελιδοδείκτες, τους κωδικούς πρόσβασης κ.ά. σε όλες τις συσκευές σας.</translation>
 <translation id="3805899903892079518">Το Chromium δεν έχει πρόσβαση σε φωτογραφίες ή βίντεό σας. Ενεργ. πρόσβασης στις Ρυθμίσεις iOS &gt; Απόρρητο &gt; Φωτογραφίες.</translation>
-<translation id="4241912885070669028">Πρόκειται να αποσυνδεθείτε από έναν λογαριασμό του οποίου η διαχείριση γίνεται από <ph name="SIGNOUT_MANAGED_DOMAIN" />. Αυτό θα διαγράψει τα δεδομένα σας Chromium από αυτήν τη συσκευή, αλλά θα διατηρηθούν στον Λογαριασμό σας Google.</translation>
 <translation id="4555020257205549924">Όταν αυτή η λειτουργία είναι ενεργοποιημένη, το Chromium θα προσφέρει τη μετάφραση σελίδων που είναι γραμμένες σε άλλες γλώσσες χρησιμοποιώντας τη Μετάφραση Google. <ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Ενεργοποίηση σαρωτή Chromium</translation>
 <translation id="4787850887676698916">Οι καρτέλες που έχετε ανοίξει στο Chromium στις άλλες συσκευές σας θα εμφανίζονται εδώ.</translation>
 <translation id="4999538639245140991">Λόγω της αποσύνδεσής σας από κάποιον λογαριασμό που είναι διαχειριζόμενος από τον τομέα <ph name="SIGNOUT_MANAGED_DOMAIN" />, τα δεδομένα Chromium θα διαγραφούν από τη συσκευή. Τα δεδομένα σας θα διατηρηθούν στον Λογαριασμό σας Google.</translation>
-<translation id="5231355151045086930">Αποσύνδεση από το Chromium</translation>
 <translation id="5862307444128926510">Καλώς ήρθατε στο Chromium</translation>
 <translation id="5945387852661427312">Συνδέεστε με έναν λογαριασμό του οποίου η διαχείριση γίνεται από <ph name="DOMAIN" /> και παραχωρείτε τον έλεγχο της διαχείρισης των δεδομένων σας Chromium. Τα δεδομένα θα συσχετιστούν με τον λογαριασμό. Η αποσύνδεση από το Chromium θα διαγράψει τα δεδομένα από τη συσκευή, αλλά θα διατηρηθούν στο Λογαριασμό σας Google.</translation>
 <translation id="6068866989048414399">Όροι Παροχ. Υπηρεσιών Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb
index 3284d83..8266269 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_en-GB.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Copied to Chromium</translation>
 <translation id="3605252743693911722">Sign in to Chromium to get your bookmarks, passwords and more on all your devices.</translation>
 <translation id="3805899903892079518">Chromium does not have access to your photos or videos. Enable access in iOS Settings &gt; Privacy &gt; Photos.</translation>
-<translation id="4241912885070669028">You are signing out of an account managed by <ph name="SIGNOUT_MANAGED_DOMAIN" />. This will delete your Chromium data from this device, but your data will remain in your Google Account.</translation>
 <translation id="4555020257205549924">When this feature is turned on, Chromium will offer to translate pages written in other languages using Google Translate. <ph name="BEGIN_LINK" />Find out more<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Turn on Chromium scanner</translation>
 <translation id="4787850887676698916">Tabs that you've opened in Chromium on your other devices will appear here.</translation>
 <translation id="4999538639245140991">Because you're signing out of an account managed by <ph name="SIGNOUT_MANAGED_DOMAIN" />, your Chromium data will be deleted from this device. Your data will remain in your Google Account.</translation>
-<translation id="5231355151045086930">Sign out of Chromium</translation>
 <translation id="5862307444128926510">Welcome to Chromium</translation>
 <translation id="5945387852661427312">You are signing in with an account managed by <ph name="DOMAIN" /> and giving its administrator control over your Chromium data. Your data will become permanently tied to this account. Signing out of Chromium will delete your data from this device, but it will remain stored in your Google Account.</translation>
 <translation id="6068866989048414399">Chromium Terms of Service</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_es-419.xtb
index 17da9762..fcc36de 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_es-419.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_es-419.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Se copió en Chromium.</translation>
 <translation id="3605252743693911722">Accede a tu cuenta en Chromium para obtener tus favoritos, contraseñas y mucho más desde todos tus dispositivos.</translation>
 <translation id="3805899903892079518">Chromium no tiene acceso a tus fotos o videos. Habilita el acceso en Configuración de iOS &gt; Privacidad &gt; Fotos.</translation>
-<translation id="4241912885070669028">Estás saliendo de una cuenta que administra <ph name="SIGNOUT_MANAGED_DOMAIN" />. Con esta acción, tus datos de Chromium se borrarán en este dispositivo, pero permanecerán en tu cuenta de Google.</translation>
 <translation id="4555020257205549924">Si activas esta función, Chromium te preguntará si deseas usar Google Traductor para traducir páginas en otros idiomas. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Activar el escáner de Chromium</translation>
 <translation id="4787850887676698916">Aquí se mostrarán las pestañas que hayas abierto en Chromium en tus otros dispositivos.</translation>
 <translation id="4999538639245140991">Como estás saliendo de una cuenta que administra <ph name="SIGNOUT_MANAGED_DOMAIN" />, tus datos de Chromium se borrarán de este dispositivo, pero permanecerán en tu Cuenta de Google.</translation>
-<translation id="5231355151045086930">Salir de Chromium</translation>
 <translation id="5862307444128926510">Bienvenido a Chromium</translation>
 <translation id="5945387852661427312">Estás accediendo con una cuenta que administra <ph name="DOMAIN" /> y dándole permiso a su administrador para que controle tus datos de Chromium. Tus datos se vincularán de forma permanente a esta cuenta. Si sales de Chromium, los datos se borrarán de este dispositivo, pero quedarán almacenados en tu cuenta de Google.</translation>
 <translation id="6068866989048414399">Condiciones del servicio de Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb
index 88a92d7..88a41de 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Copiada a Chromium</translation>
 <translation id="3605252743693911722">Inicia sesión en Chromium para sincronizar los marcadores, las contraseñas y mucho más en todos tus dispositivos.</translation>
 <translation id="3805899903892079518">Chromium no puede acceder a tus fotos y vídeos (para permitirlo, ve a Ajustes de iOS &gt; Privacidad &gt; Fotos).</translation>
-<translation id="4241912885070669028">Estás cerrando sesión en una cuenta gestionada por <ph name="SIGNOUT_MANAGED_DOMAIN" />. Tus datos de Chromium se eliminarán de este dispositivo, pero permanecerán en tu cuenta de Google.</translation>
 <translation id="4555020257205549924">Si esta función está activada, Chromium ofrecerá la posibilidad de traducir páginas escritas en otros idiomas con el Traductor de Google. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Activar el escáner de Chromium</translation>
 <translation id="4787850887676698916">Aquí aparecerán las pestañas que hayas abierto en Chromium en otros dispositivos.</translation>
 <translation id="4999538639245140991">Al cerrar sesión en una cuenta gestionada por <ph name="SIGNOUT_MANAGED_DOMAIN" />, se eliminan tus datos de Chromium en este dispositivo, pero permanecen en tu cuenta de Google.</translation>
-<translation id="5231355151045086930">Cerrar sesión en Chromium</translation>
 <translation id="5862307444128926510">Te damos la bienvenida a Chromium</translation>
 <translation id="5945387852661427312">Estás iniciando sesión con una cuenta gestionada por <ph name="DOMAIN" /> y vas a otorgar a su administrador el control sobre tus datos de Chromium. Tus datos se vincularán de forma permanente a esta cuenta. Al cerrar sesión en Chromium, tus datos se eliminarán de este dispositivo, pero permanecerán almacenados en tu cuenta de Google.</translation>
 <translation id="6068866989048414399">Condiciones de Servicio de Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb
index 9d28d9e..e091348 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Kopeeritud Chromiumi</translation>
 <translation id="3605252743693911722">Logige Chromiumi sisse, et kõikides oma seadmetes kasutada järjehoidjaid, paroole ja muud.</translation>
 <translation id="3805899903892079518">Chromiumil pole juurdepääsu fotodele ega videotele. Lubage iOS-is juurdepääs valikutega Seaded &gt; Privaatsus &gt; Fotod.</translation>
-<translation id="4241912885070669028">Logite välja kontolt, mida haldab <ph name="SIGNOUT_MANAGED_DOMAIN" />. Selle tulemusel kustutatakse seadmes olevad Chromiumi andmed, kuid need jäävad alles teie Google'i kontole.</translation>
 <translation id="4555020257205549924">Kui see funktsioon on sisse lülitatud, pakub Chromium võimalust tõlkida teistes keeltes kirjutatud lehti Google'i tõlke abil. <ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Lülitage sisse Chromiumi skanner</translation>
 <translation id="4787850887676698916">Siin kuvatakse teie teistes seadmetes Chromiumis avatud vahelehed.</translation>
 <translation id="4999538639245140991">Kuna logite välja kontolt, mida haldab <ph name="SIGNOUT_MANAGED_DOMAIN" />, kustutatakse selles seadmes teie Chromiumi andmed. Google'i kontole jäävad teie andmed alles.</translation>
-<translation id="5231355151045086930">Chromiumist väljalogimine</translation>
 <translation id="5862307444128926510">Tere tulemast Chromiumi</translation>
 <translation id="5945387852661427312">Logite sisse kontoga, mida haldab <ph name="DOMAIN" />, ja annate selle administraatorile üle Chromiumi andmete juhtimise. Teie andmed seotakse jäädavalt selle kontoga. Chromiumist väljalogimisel kustutatakse teie andmed sellest seadmest, kuid need jäävad alles teie Google'i kontole.</translation>
 <translation id="6068866989048414399">Chromiumi teenusetingimused</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_fa.xtb
index 0856bef..df421ddb 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fa.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">‏به Chromium کپی شد</translation>
 <translation id="3605252743693911722">‏برای دریافت نشانک‌ها، گذرواژه‌ها و موارد دیگر در همه دستگاه‌هایتان، به سیستم Chromium وارد شوید.</translation>
 <translation id="3805899903892079518">‏Chromium به عکس‌ها یا ویدیوهای شما دسترسی ندارد. با رفتن به تنظیمات iOS &gt; حریم خصوصی &gt; عکس‌ها دسترسی را فعال کنید.</translation>
-<translation id="4241912885070669028">‏هم‌اکنون درحال خارج شدن از حسابی هستید که توسط <ph name="SIGNOUT_MANAGED_DOMAIN" /> مدیریت می‌شود. با این کار، داده‌های Chromium شما از این دستگاه حذف می‌شوند اما همچنان در حساب Google شما باقی می‌مانند.</translation>
 <translation id="4555020257205549924">‏وقتی این قابلیت روشن است، Chromium ترجمه صفحات نوشته‌شده به سایر زبان‌ها را با استفاده از مترجم Google پیشنهاد می‌دهد. <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">‏روشن کردن اسکنر Chromium</translation>
 <translation id="4787850887676698916">‏برگه‌هایی که در دستگاه‌های دیگر در Chromium باز کرده‌اید، در اینجا نشان داده می‌شوند.</translation>
 <translation id="4999538639245140991">‏ازآنجایی‌که درحال خارج شدن از حسابی هستید که <ph name="SIGNOUT_MANAGED_DOMAIN" /> آن را مدیریت می‌کند، داده‌های Chromium شما از این دستگاه حذف خواهد شد. داده‌هایتان در حساب Google شما باقی می‌ماند.</translation>
-<translation id="5231355151045086930">‏خروج از سیستم Chromium</translation>
 <translation id="5862307444128926510">‏به Chromium خوش آمدید</translation>
 <translation id="5945387852661427312">‏هم‌اکنون درحال ورود به سیستم با حسابی مدیریت‌شده توسط <ph name="DOMAIN" /> و دادن کنترل داده‌های Chromium خود به سرپرست این حساب هستید. داده‌هایتان به‌طور دائم به این حساب مرتبط می‌شوند. با خروج از Chrome، داده‌هایتان از این دستگاه حذف می‌شوند اما همچنان در حساب Google شما باقی می‌ماند.</translation>
 <translation id="6068866989048414399">‏شرایط خدمات Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_fi.xtb
index bd8bd22..80771cf 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_fi.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fi.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Kopioitiin Chromiumiin.</translation>
 <translation id="3605252743693911722">Kirjaudu sisään Chromiumiin, jotta voit käyttää kirjanmerkkejäsi, salasanojasi ja muita asetuksiasi kaikilla laitteillasi.</translation>
 <translation id="3805899903892079518">Chromium ei voi käyttää kuviasi tai videoitasi. Anna käyttöoikeus kohdassa iOS-asetukset &gt; Tietosuoja &gt; Kuvat.</translation>
-<translation id="4241912885070669028">Olet kirjautumassa ulos verkkotunnuksen <ph name="SIGNOUT_MANAGED_DOMAIN" /> hallitsemalta tililtä. Chromium-tietosi poistetaan tältä laitteelta, mutta tietosi säilyvät Google-tililläsi.</translation>
 <translation id="4555020257205549924">Kun tämä ominaisuus on käytössä, Chromium tarjoaa vierailla kielillä kirjoitettujen sivujen käännöksiä Google Kääntäjän kautta. <ph name="BEGIN_LINK" />Lisätietoja<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Ota käyttöön Chromium-lukija</translation>
 <translation id="4787850887676698916">Muilla laitteilla Chromiumissa avaamasi välilehdet näytetään täällä.</translation>
 <translation id="4999538639245140991">Koska kirjaudut ulos verkkotunnuksen <ph name="SIGNOUT_MANAGED_DOMAIN" /> ylläpitämältä tililtä, Chromium-datasi poistetaan tältä laitteelta. Se säilyy edelleen Google-tililläsi.</translation>
-<translation id="5231355151045086930">Kirjaudu ulos Chromiumista</translation>
 <translation id="5862307444128926510">Tervetuloa Chromiumiin</translation>
 <translation id="5945387852661427312">Olet kirjautumassa sisään verkkotunnuksen <ph name="DOMAIN" /> hallitsemalla tilillä ja antamassa sen järjestelmänvalvojalle oikeuden hallita Chromium-tietojasi. Tietosi liitetään pysyvästi tähän tiliin. Chromiumista uloskirjautuminen poistaa tietosi tältä laitteelta, mutta ne säilyvät Google-tililläsi.</translation>
 <translation id="6068866989048414399">Chromiumin käyttöehdot</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb
index 8adc3a7..c6a9cb0 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Kinopya sa Chromium</translation>
 <translation id="3605252743693911722">Mag-sign in sa Chromium upang makuha ang iyong mga bookmark, password, at higit pa sa lahat ng device mo.</translation>
 <translation id="3805899903892079518">Walang access ang Chromium sa mga larawan o video mo. I-enable ang access sa Mga Setting ng iOS &gt; Privacy &gt; Mga Larawan.</translation>
-<translation id="4241912885070669028">Nagsa-sign out ka sa account na pinamamahalaan ng <ph name="SIGNOUT_MANAGED_DOMAIN" />. Ide-delete nito ang data mo sa Chromium sa device na ito, ngunit mananatili ang data mo sa iyong Google account.</translation>
 <translation id="4555020257205549924">Kapag naka-on ang feature na ito, mag-aalok ang Chromium na magsalin ng mga page na nakasulat sa ibang mga wika gamit ang Google Translate. <ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">I-on ang scanner ng Chromium</translation>
 <translation id="4787850887676698916">Dito lalabas ang mga nabuksan mong tab sa Chromium sa iba mo pang mga device.</translation>
 <translation id="4999538639245140991">Dahil magsa-sign out ka sa account na pinapamahalaan ng <ph name="SIGNOUT_MANAGED_DOMAIN" />, made-delete ang iyong data sa Chromium sa device na ito. Mananatili ang data mo sa iyong Google Account.</translation>
-<translation id="5231355151045086930">Mag-sign out sa Chromium</translation>
 <translation id="5862307444128926510">Maligayang Pagdating sa Chromium</translation>
 <translation id="5945387852661427312">Nag-sign in ka gamit ang account na pinamamahalaan ng <ph name="DOMAIN" /> at binibigyan mo ang administrator nito ng kontrol sa iyong data sa Chromium. Permanenteng mauugnay ang data mo sa account na ito. Made-delete ang data mo sa device na ito kapag nag-sign out ka sa Chromium, ngunit mananatili itong naka-store sa Google Account mo.</translation>
 <translation id="6068866989048414399">Tuntunin ng Serbisyo ng Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_fr.xtb
index 8e3ae28..a8e6ca4 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fr.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Copié dans Chromium</translation>
 <translation id="3605252743693911722">Connectez-vous à Chromium pour accéder à vos favoris, mots de passe et bien plus sur tous vos appareils.</translation>
 <translation id="3805899903892079518">Chromium n'a pas accès à vos photos ni à vos vidéos. Activez l'accès dans iOS via Réglages &gt; Confidentialité &gt; Photos.</translation>
-<translation id="4241912885070669028">Vous vous déconnectez d'un compte géré par <ph name="SIGNOUT_MANAGED_DOMAIN" />. Cette opération entraînera la suppression de vos données Chromium de cet appareil, mais celles-ci seront conservées dans votre compte Google.</translation>
 <translation id="4555020257205549924">Lorsque cette fonctionnalité est activée dans Chromium, un message s'affiche pour vous proposer que les pages de ce site rédigées dans d'autres langues soient traduites à l'aide de Google Traduction. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Activer le lecteur Chromium</translation>
 <translation id="4787850887676698916">Les onglets que vous avez ouverts dans Chromium sur vos autres appareils s'affichent ici.</translation>
 <translation id="4999538639245140991">Comme vous vous déconnectez d'un compte géré par <ph name="SIGNOUT_MANAGED_DOMAIN" />, vos données Chromium seront supprimées de cet appareil, mais elles seront conservées dans votre compte Google.</translation>
-<translation id="5231355151045086930">Se déconnecter de Chromium</translation>
 <translation id="5862307444128926510">Bienvenue dans Chromium</translation>
 <translation id="5945387852661427312">Vous vous connectez avec un compte géré par <ph name="DOMAIN" />, ce qui permettra à son administrateur de contrôler vos données Chromium. Celles-ci seront définitivement associées à ce compte. Si vous vous déconnectez de Chromium, vos données seront supprimées de cet appareil, mais elles seront conservées dans votre compte Google.</translation>
 <translation id="6068866989048414399">Conditions d'utilisation Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_gu.xtb
index 447acd0..763ab4a0 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_gu.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_gu.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Chromium પર કૉપી કરી</translation>
 <translation id="3605252743693911722">તમારા બધા ઉપકરણો પર તમારા બુકમાર્ક, પાસવર્ડ અને બીજુ ઘણું મેળવવા માટે Chromiumમાં સાઇન ઇન કરો.</translation>
 <translation id="3805899903892079518">Chromiumને તમારા ફોટા અથવા વીડિયોનો ઍક્સેસ નથી. iOS સેટિંગ &gt; પ્રાઇવસી &gt; ફોટામાં ઍક્સેસને ચાલુ કરો.</translation>
-<translation id="4241912885070669028">તમે <ph name="SIGNOUT_MANAGED_DOMAIN" /> દ્વારા મેનેજ એકાઉન્ટમાંથી સાઇન આઉટ કરી રહ્યાં છો. આ તમારા Chromium ડેટાને આ ડિવાઇસમાંથી ડિલીટ કરશે, પરંતુ તમારો ડેટા તમારા Google એકાઉન્ટમાં રહેશે.</translation>
 <translation id="4555020257205549924">જ્યારે આ સુવિધા ચાલુ કરી હોય, ત્યારે Chromium, Google અનુવાદનો ઉપયોગ કરીને અન્ય ભાષાઓમાં લખેલા પૃષ્ઠોના અનુવાદની ઓફર કરશે. <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Chromium સ્કૅન ચાલુ કરો</translation>
 <translation id="4787850887676698916">તમારા અન્ય ઉપકરણો પર તમે Chromium માં ખોલેલા ટૅબ્સ અહીં દેખાશે.</translation>
 <translation id="4999538639245140991">કારણ કે તમે <ph name="SIGNOUT_MANAGED_DOMAIN" /> દ્વારા મેનેજ કરવામાં આવેલ એકાઉન્ટમાંથી સાઇન આઉટ કરી રહ્યાં છો, આ ડિવાઇસમાંથી તમારા Chromium ડેટા ડિલીટ થઈ જશે. તમારો ડેટા તમારા Google એકાઉન્ટમાં જળવાઈ રહેશે.</translation>
-<translation id="5231355151045086930">Chromiumમાંથી સાઇન આઉટ કરો</translation>
 <translation id="5862307444128926510">Chromium માં સ્વાગત છે</translation>
 <translation id="5945387852661427312">તમે <ph name="DOMAIN" /> દ્વારા મેનેજ એકાઉન્ટમાં સાઇન ઇન કરી રહ્યાં છો અને તમારા Chromium ડેટા પર એનું એડમિન નિયંત્રણ આપી રહ્યાં છો. તમારો ડેટા આ એકાઉન્ટ સાથે કાયમીરૂપે જોડાયેલું રહેશે. Chromiumમાંથી સાઇન આઉટ કરવું આ ડિવાઇસ પરથી તમારો ડેટા ડિલીટ કરશે, પરંતુ એ તમારા Google એકાઉન્ટમાં સ્ટોર રહેશે.</translation>
 <translation id="6068866989048414399">Chromium સેવાની શરતો</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb
index ae5b3ad..078ab32b 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb
@@ -21,12 +21,10 @@
 <translation id="3256316712990552818">क्रोमियम पर कॉपी किया गया</translation>
 <translation id="3605252743693911722">अपने सभी डिवाइस पर बुकमार्क, पासवर्ड और ज़्यादा चीज़ें पाने के लिए क्रोमियम में साइन इन करें.</translation>
 <translation id="3805899903892079518">Chromium के पास आपकी फ़ोटो या वीडियो का एक्सेस नहीं है. iOS सेटिंग &gt; गोपनीयता &gt; फ़ोटो में एक्सेस चालू करें.</translation>
-<translation id="4241912885070669028">आप <ph name="SIGNOUT_MANAGED_DOMAIN" /> से प्रबंधित खाते से साइन ऑउट कर रहे हैं. इससे आपका क्रोमियम डेटा इस डिवाइस से मिट जाएगा, लेकिन आपका डेटा आपके Google खाते में बना रहेगा.</translation>
 <translation id="4555020257205549924">जब यह सुविधा चालू होती है, तो क्रोमियम अन्य भाषा में लिखे पृष्ठों को Google अनुवाद का उपयोग करके अनुवाद करने के लिए ऑफ़र करेगा. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">अपना क्रोमियम स्कैनर चालू करें</translation>
 <translation id="4787850887676698916">आपके अन्य डिवाइस पर क्रोमियम में खोले हुए आपके टैब यहां दिखाई देंगे.</translation>
 <translation id="4999538639245140991">क्‍योंकि आप <ph name="SIGNOUT_MANAGED_DOMAIN" /> की ओर से प्रबंधित खाते से साइन आउट कर रहे हैं, इसलिए आपका क्रोमियम डेटा इस डिवाइस से मिट जाएगा. आपका डेटा आपके Google खाते में बना रहेगा.</translation>
-<translation id="5231355151045086930">क्रोमियम से प्रस्थान करें</translation>
 <translation id="5862307444128926510">क्रोमियम में आपका स्वागत है</translation>
 <translation id="5945387852661427312">आप <ph name="DOMAIN" /> से प्रबंधित खाते में साइन इन कर रहे हैं और उसके एडमिन को अपने क्रोमियम डेटा पर नियंत्रण दे रहे हैं. आपका डेटा इस खाते से स्थायी रूप से जुड़ जाएगा. क्रोमियम से साइन आउट करने से आपका डेटा इस डिवाइस से मिट जाएगा, लेकिन वह आपके Google खाते में बना रहेगा.</translation>
 <translation id="6068866989048414399">Chromium सेवा की शर्तें</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_hr.xtb
index ba80d30..846e9b5 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hr.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Kopirano na Chromium</translation>
 <translation id="3605252743693911722">Prijavite se na Chromium kako bi ste mogli pristupati oznakama, zaporkama i ostalom na svim svojim uređajima.</translation>
 <translation id="3805899903892079518">Chromium nema pristup fotografijama ni videozapisima. Omogućite pristup u Postavkama iOS-a &gt; Privatnost &gt; Fotografije.</translation>
-<translation id="4241912885070669028">Odjavljujete se s računa kojim upravlja <ph name="SIGNOUT_MANAGED_DOMAIN" />. Vaši podaci na Chromiumu izbrisat će se s ovog uređaja, no ostat će na vašem Google računu.</translation>
 <translation id="4555020257205549924">Kada je ta značajka uključena, Chromium će ponuditi prijevod stranica napisanih na drugim jezicima pomoću Google prevoditelja. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Uključite Chromiumov skener</translation>
 <translation id="4787850887676698916">Ovdje će se prikazati kartice koje ste otvorili u Chromiumu na svojim ostalim uređajima.</translation>
 <translation id="4999538639245140991">Budući da se odjavljujete s računa kojim upravlja <ph name="SIGNOUT_MANAGED_DOMAIN" />, vaši podaci iz Chromiuma izbrisat će se s ovog uređaja, no ostat će na vašem Google računu.</translation>
-<translation id="5231355151045086930">Odjava s Chromiuma</translation>
 <translation id="5862307444128926510">Dobro došli u Chromium</translation>
 <translation id="5945387852661427312">Prijavljujete se računom kojim upravlja <ph name="DOMAIN" /> i njegovom administratoru dajete kontrolu nad svojim podacima u Chromiumu. Vaši će se podaci trajno povezati s tim računom. Ako se odjavite s Chromiuma, vaši će se podaci izbrisati s ovog uređaja, no ostat će pohranjeni na vašem Google računu.</translation>
 <translation id="6068866989048414399">Uvjeti pružanja Chromiuma</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_hu.xtb
index c5c5ab1..ffffde1 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_hu.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hu.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">A Chromiumra másolva</translation>
 <translation id="3605252743693911722">Jelentkezzen be a Chromiumba, hogy az összes eszközén hozzáférhessen könyvjelzőihez, jelszavaihoz és más beállításaihoz.</translation>
 <translation id="3805899903892079518">A Chromium nem fér hozzá az Ön képeihez és videóihoz. Engedélyezés iOS-en: Beállítások &gt; Adatvédelem &gt; Fényképek.</translation>
-<translation id="4241912885070669028">Kijelentkezik egy <ph name="SIGNOUT_MANAGED_DOMAIN" /> által felügyelt fiókból. Ezzel törli az eszközön található Chromium-adatokat, amelyek azonban Google-fiókjában megmaradnak.</translation>
 <translation id="4555020257205549924">Ha a funkció be van kapcsolva, a Chromium felajánlja a más nyelveken írt oldalak lefordítását a Google Fordító segítségével. <ph name="BEGIN_LINK" />További információ<ph name="END_LINK" />.</translation>
 <translation id="4681781466797808448">Kapcsolja be a Chromium szkennerét</translation>
 <translation id="4787850887676698916">A más eszközökön futó Chromium böngészőben megnyitott lapok itt jelennek meg.</translation>
 <translation id="4999538639245140991">Mivel kijelentkezik a(z) <ph name="SIGNOUT_MANAGED_DOMAIN" /> által felügyelt fiókból, törli az eszközön található Chromium-adatokat. Ezek az adatok Google-fiókjában továbbra is megmaradnak.</translation>
-<translation id="5231355151045086930">Kijelentkezés a Chromiumból</translation>
 <translation id="5862307444128926510">Üdvözli a Chromium!</translation>
 <translation id="5945387852661427312">Egy <ph name="DOMAIN" /> által felügyelt fiókkal jelentkezik be, és engedélyezi az adminisztrátor számára a Chromium-adatok kezelését. Adatai állandó jelleggel ehhez a fiókhoz lesznek társítva. A Chromiumból való kijelentkezéssel törli adatait erről az eszközről, de azok továbbra is megmaradnak Google-fiókjában.</translation>
 <translation id="6068866989048414399">Chromium – ÁSZF</translation>
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 e23f5c55..950121d 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Disalin ke Chromium</translation>
 <translation id="3605252743693911722">Login ke Chromium untuk mendapatkan bookmark, sandi, dan lainnya di semua perangkat Anda.</translation>
 <translation id="3805899903892079518">Chromium tidak memiliki akses ke foto atau video Anda. Izinkan akses di iOS Settings &gt; Privacy &gt; Photos.</translation>
-<translation id="4241912885070669028">Anda keluar dari akun yang dikelola oleh <ph name="SIGNOUT_MANAGED_DOMAIN" />. Tindakan ini akan menghapus data Chromium dari perangkat, namun data Anda akan tetap tersedia di Akun Google.</translation>
 <translation id="4555020257205549924">Saat fitur ini diaktifkan, Chromium akan menawarkan untuk menerjemahkan halaman yang ditulis dalam bahasa lain menggunakan Google Terjemahan. <ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Aktifkan pemindai Chromium</translation>
 <translation id="4787850887676698916">Tab yang telah dibuka di Chromium pada perangkat lainnya akan muncul di sini.</translation>
 <translation id="4999538639245140991">Karena Anda logout dari akun yang dikelola oleh <ph name="SIGNOUT_MANAGED_DOMAIN" />, data Chromium Anda akan dihapus dari perangkat ini. Data Anda akan tetap tersedia di Akun Google Anda.</translation>
-<translation id="5231355151045086930">Keluar dari Chromium</translation>
 <translation id="5862307444128926510">Selamat Datang di Chromium</translation>
 <translation id="5945387852661427312">Anda masuk dengan akun yang dikelola oleh <ph name="DOMAIN" /> dan memberikan kontrol data Chromium kepada administrator. Data Anda akan terikat dengan akun ini secara permanen. Bila Anda keluar dari Chromium, data akan dihapus dari perangkat ini, namun tetap disimpan di Akun Google.</translation>
 <translation id="6068866989048414399">Persyaratan Layanan Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_it.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_it.xtb
index ccc011b..85839c7 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_it.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_it.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Copiata in Chromium</translation>
 <translation id="3605252743693911722">Accedi a Chromium per trovare i tuoi preferiti, le password e altre impostazioni su tutti i tuoi dispositivi.</translation>
 <translation id="3805899903892079518">Chromium non ha accesso alle tue foto o ai tuoi video. Attiva l'accesso in Impostazioni iOS &gt; Privacy &gt; Foto.</translation>
-<translation id="4241912885070669028">Stai per uscire da un account gestito da <ph name="SIGNOUT_MANAGED_DOMAIN" />. I dati di Chromium verranno eliminati da questo dispositivo, ma rimarranno memorizzati nel tuo Account Google.</translation>
 <translation id="4555020257205549924">Quando questa funzione è attiva, Chromium si offre di tradurre le pagine scritte in altre lingue utilizzando Google Traduttore. <ph name="BEGIN_LINK" />Ulteriori informazioni<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Attiva lo scanner di Chromium</translation>
 <translation id="4787850887676698916">Le schede aperte in Chromium sugli altri dispositivi verranno visualizzate qui.</translation>
 <translation id="4999538639245140991">Dal momento che stai per uscire da un account gestito da <ph name="SIGNOUT_MANAGED_DOMAIN" />, i dati di Chromium verranno eliminati da questo dispositivo, ma rimarranno memorizzati nel tuo Account Google.</translation>
-<translation id="5231355151045086930">Uscita da Chromium</translation>
 <translation id="5862307444128926510">Benvenuto in Chromium</translation>
 <translation id="5945387852661427312">Stai per eseguire l'accesso con un account gestito da <ph name="DOMAIN" /> e consentire al relativo amministratore di avere il controllo dei tuoi dati di Chromium. I tuoi dati verranno associati definitivamente a questo account. Se esci da Chromium, i dati verranno eliminati da questo dispositivo, ma rimarranno memorizzati nel tuo Account Google.</translation>
 <translation id="6068866989048414399">Termini di servizio di Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb
index 43ff0d5..8c94939f 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">‏הועתק אל Chromium</translation>
 <translation id="3605252743693911722">‏יש להיכנס אל Chromium כדי לקבל גישה אל הסימניות, הסיסמאות ונתונים נוספים בכל המכשירים שלך.</translation>
 <translation id="3805899903892079518">‏ל-Chromium אין גישה לתמונות או לסרטונים שלך. אפשר גישה ב'הגדרות iOS' &gt; 'פרטיות' &gt; 'תמונות'.</translation>
-<translation id="4241912885070669028">‏אתה יוצא מחשבון המנוהל על-ידי <ph name="SIGNOUT_MANAGED_DOMAIN" />. פעולה זו תמחק את הנתונים שלך ב-Chromium מהמכשיר הזה, אבל הם יישארו בחשבון Google שלך.</translation>
 <translation id="4555020257205549924">‏כשהתכונה הזו פועלת, Chromium יציע לתרגם באמצעות Google Translate דפים שנכתבו בשפות אחרות‏. <ph name="BEGIN_LINK" />למידע נוסף<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">‏הפעלת הסורק של Chromium</translation>
 <translation id="4787850887676698916">‏כרטיסיות שפתחת ב-Chromium במכשירים האחרים שלך יופיעו כאן.</translation>
 <translation id="4999538639245140991">‏יציאה מחשבון שמנוהל על ידי <ph name="SIGNOUT_MANAGED_DOMAIN" /> תגרום למחיקת נתוני Chromium שלך מהמכשיר הזה. הנתונים האלה יישארו בחשבון Google שלך.</translation>
-<translation id="5231355151045086930">‏יציאה מ-Chromium</translation>
 <translation id="5862307444128926510">‏ברוכים הבאים ל-Chromium‏</translation>
 <translation id="5945387852661427312">‏אתה נכנס עם חשבון המנוהל על-ידי <ph name="DOMAIN" /> ומעניק למנהל שלו שליטה על הנתונים שלך ב-Chromium. הנתונים שלך ישויכו לצמיתות אל החשבון הזה. יציאה מ-Chromium תמחק את הנתונים שלך מהמכשיר הזה, אבל הם יישארו בחשבון Google שלך.</translation>
 <translation id="6068866989048414399">‏התנאים וההגבלות של Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ja.xtb
index fdc5c8c..87ee59a1 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ja.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ja.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Chromium にコピー済み</translation>
 <translation id="3605252743693911722">Chromium にログインすれば、ブックマーク、パスワード、その他の設定をどのデバイスからでもご利用いただけます。</translation>
 <translation id="3805899903892079518">Chromium で写真または動画にアクセスできません。iOS の [設定] &gt; [プライバシー] &gt; [写真] でアクセスを有効にしてください。</translation>
-<translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" /> で管理されているアカウントからログアウトしようとしています。ログアウトすると、Chromium データはこのデバイスから削除されますが、Google アカウントには残ります。</translation>
 <translation id="4555020257205549924">この機能を有効にすると、外国語のページを開いたときに翻訳ツールが表示されます。<ph name="BEGIN_LINK" />詳細<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Chromium のスキャナをオンにしてください</translation>
 <translation id="4787850887676698916">他のデバイスの Chromium で開いているタブがここに表示されます。</translation>
 <translation id="4999538639245140991"><ph name="SIGNOUT_MANAGED_DOMAIN" /> で管理されているアカウントからログアウトするにあたり、Chromium データはこのデバイスから削除されます(ただし Google アカウントには残ります)。</translation>
-<translation id="5231355151045086930">Chromium からのログアウト</translation>
 <translation id="5862307444128926510">Chromium へようこそ</translation>
 <translation id="5945387852661427312"><ph name="DOMAIN" /> で管理されているアカウントでログインして、Chromium データの管理を管理者に委ねようとしています。この操作を行うと、データはこのアカウントに恒久的に関連付けられます。Chromium からログアウトすると、データはこのデバイスから削除されますが、Google アカウントには残ります。</translation>
 <translation id="6068866989048414399">Chromium 利用規約</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb
index d04dc8f..4f0105d 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Chromium ಗೆ ನಕಲಿಸಲಾಗಿದೆ</translation>
 <translation id="3605252743693911722">ನಿಮ್ಮ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳು, ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಮತ್ತು ಇನ್ನಷ್ಟನ್ನು ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ಪಡೆದುಕೊಳ್ಳಲು Chromium ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation>
 <translation id="3805899903892079518">Chromium ನಿಮ್ಮ ಫೋಟೋಗಳು ಮತ್ತು ವೀಡಿಯೋಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿಲ್ಲ. iOS ಸೆಟ್ಟಿಂಗ್‌ಗಳು &gt; ಗೌಪ್ಯತೆ &gt; ಫೋಟೋಗಳಲ್ಲಿ ಪ್ರವೇಶವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
-<translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" /> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾದ ಖಾತೆಯಿಂದ ನೀವು ಸೈನ್ ಔಟ್ ಮಾಡುತ್ತಿರುವಿರಿ. ಇದು ಈ ಸಾಧನದಿಂದ ನಿಮ್ಮ Chromium ಡೇಟಾವನ್ನು ಅಳಿಸುತ್ತದೆ, ಆದರೆ ನಿಮ್ಮ ಡೇಟಾ ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿಯೇ ಇರುತ್ತದೆ.</translation>
 <translation id="4555020257205549924">ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಆನ್ ಮಾಡಿದಾಗ, Google ಅನುವಾದ ಬಳಸಿಕೊಂಡು ಬೇರೆ ಭಾಷೆಗಳಲ್ಲಿ ಬರೆದ ಪುಟಗಳನ್ನು ಅನುವಾದಿಸಲು Chromium ಅವಕಾಶ ನೀಡುತ್ತದೆ. <ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Chromium ಸ್ಕ್ಯಾನರ್ ಆನ್ ಮಾಡಿ</translation>
 <translation id="4787850887676698916">ನಿಮ್ಮ ಇತರ ಸಾಧನಗಳಲ್ಲಿನ Chromium ನಲ್ಲಿ ನೀವು ತೆರೆದಿರುವಂತಹ ಟ್ಯಾಬ್‌ಗಳು ಇಲ್ಲಿ ಗೋಚರಿಸುತ್ತವೆ.</translation>
 <translation id="4999538639245140991"><ph name="SIGNOUT_MANAGED_DOMAIN" /> ಮೂಲಕ ನಿರ್ವಹಿಸಲ್ಪಡುವ ಖಾತೆಯಿಂದ ನೀವು ಸೈನ್ ಔಟ್ ಮಾಡುತ್ತಿರುವ ಕಾರಣ, ನಿಮ್ಮ Chromium ಡೇಟಾವನ್ನು ಈ ಸಾಧನದಿಂದ ಅಳಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ ಡೇಟಾ ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿಯೇ ಇರುತ್ತದೆ.</translation>
-<translation id="5231355151045086930">Chromium ನಿಂದ ಸೈನ್‌ ಔಟ್‌ ಮಾಡಿ</translation>
 <translation id="5862307444128926510">Chromium ಗೆ ಸುಸ್ವಾಗತ</translation>
 <translation id="5945387852661427312"><ph name="DOMAIN" /> ನಿರ್ವಹಿಸಿದ ಖಾತೆಯ ಮೂಲಕ ನೀವು ಸೈನ್‍‍ ಇನ್ ಮಾಡುತ್ತಿರುವಿರಿ ಮತ್ತು ಅದರ ನಿರ್ವಾಹಕರಿಗೆ ನಿಮ್ಮ Chromium ಡೇಟಾದ ನಿಯಂತ್ರಣವನ್ನು ನೀಡುತ್ತಿರುವಿರಿ. ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಶಾಶ್ವತವಾಗಿ ಈ ಖಾತೆಯೊಂದಿಗೆ ಜೋಡಿಸಲಾಗುತ್ತದೆ. Chromium ನಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡುವುದರಿಂದ ಈ ಸಾಧನದಿಂದ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಅಳಿಸುತ್ತದೆ, ಆದರೆ ಅದು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಸಂಗ್ರಹಿತವಾಗಿಯೇ ಇರುತ್ತದೆ.</translation>
 <translation id="6068866989048414399">Chromium ಸೇವಾ ನಿಯಮಗಳು</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb
index e7b357a..eb3a16c6 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Chromium에 복사됨</translation>
 <translation id="3605252743693911722">Chromium에 로그인하여 모든 기기에서 내 북마크, 비밀번호 등을 사용하세요.</translation>
 <translation id="3805899903892079518">Chromium에서 사진 또는 동영상에 액세스할 수 없습니다. 'iOS 설정 &gt; 개인정보 보호 &gt; 사진'에서 액세스를 허용하세요.</translation>
-<translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" />에서 관리하는 계정에서 로그아웃합니다. 이렇게 하면 내 Chromium 데이터가 이 기기에서 삭제되지만 Google 계정에는 그대로 유지됩니다.</translation>
 <translation id="4555020257205549924">이 기능을 사용하면 Chromium에서 Google 번역을 사용하여 외국어로 작성된 페이지를 번역합니다. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Chromium 스캐너 사용</translation>
 <translation id="4787850887676698916">다른 기기의 Chromium에서 연 탭이 여기에 표시됩니다.</translation>
 <translation id="4999538639245140991"><ph name="SIGNOUT_MANAGED_DOMAIN" />에서 관리하는 계정에서 로그아웃하면 Chromium 데이터가 기기에서 삭제되나 Google 계정에는 그대로 유지됩니다.</translation>
-<translation id="5231355151045086930">Chromium에서 로그아웃</translation>
 <translation id="5862307444128926510">Chromium에 오신 것을 환영합니다.</translation>
 <translation id="5945387852661427312"><ph name="DOMAIN" />에서 관리하는 계정으로 로그인합니다. 계정 관리자가 내 Chromium 데이터를 관리하게 되며 데이터는 이 계정에 영구적으로 연결됩니다. Chromium에서 로그아웃하면 데이터가 기기에서 삭제되지만 Google 계정에는 그대로 유지됩니다.</translation>
 <translation id="6068866989048414399">Chromium 서비스 약관</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_lt.xtb
index b7c33aeb..d9ba1e3 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_lt.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_lt.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Nukopijuota į „Chromium“</translation>
 <translation id="3605252743693911722">Prisijunkite prie „Chromium“, kad galėtumėte naudoti žymes, slaptažodžius ir kitus nustatymus visuose įrenginiuose.</translation>
 <translation id="3805899903892079518">„Chromium“ nepasiekia nuotraukų ar vaizdo įr. Įgalinkite prieigą apsil. „iOS“ nustatymai“ &gt; „Privatumas“ &gt; „Nuotraukos“.</translation>
-<translation id="4241912885070669028">Atsijungiate nuo paskyros, kurią valdo <ph name="SIGNOUT_MANAGED_DOMAIN" />. „Chromium“ duomenys bus ištrinti iš šio įrenginio, bet liks „Google“ paskyroje.</translation>
 <translation id="4555020257205549924">Kai ši funkcija bus įjungta, „Chromium“ siūlys versti kitomis kalbomis parašytus puslapius naudojant „Google“ vertėją. <ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Įjunkite „Chromium“ skaitytuvą</translation>
 <translation id="4787850887676698916">Čia bus rodomi kituose įrenginiuose atidaryti „Chromium“ skirtukai.</translation>
 <translation id="4999538639245140991">Atsijungiate nuo paskyros, kurią valdo <ph name="SIGNOUT_MANAGED_DOMAIN" />, todėl „Chromium“ duomenys bus ištrinti iš šio įrenginio. Duomenys išliks jūsų „Google“ paskyroje.</translation>
-<translation id="5231355151045086930">Atsijungimas nuo „Chromium“</translation>
 <translation id="5862307444128926510">Sveiki, tai „Chromium“</translation>
 <translation id="5945387852661427312">Prisijungiate naudodami <ph name="DOMAIN" /> valdomą paskyrą ir suteikiate jos administratoriui galimybę valdyti jūsų „Chromium“ duomenis. Duomenys bus visam laikui susieti su šia paskyra. Atsijungę nuo „Chromium“ ištrinsite duomenis iš šio įrenginio, bet jie ir toliau bus saugomi „Google“ paskyroje.</translation>
 <translation id="6068866989048414399">„Chromium“ pasl. teikimo sąl.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb
index f82f377..3c5ba6df 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Nokopēta pārlūkā Chromium</translation>
 <translation id="3605252743693911722">Pierakstieties pārlūkā Chromium, lai iegūtu savas grāmatzīmes, paroles un citu saturu visās savās ierīcēs.</translation>
 <translation id="3805899903892079518">Chromium nevar piekļūt jūsu fotoattēliem un videoklipiem. Iespējojiet piekļuvi: iOS Settings &gt; Privacy &gt; Photos.</translation>
-<translation id="4241912885070669028">Jūs izrakstāties no konta, kas tiek pārvaldīts domēnā <ph name="SIGNOUT_MANAGED_DOMAIN" />. Izrakstoties Chromium dati tiks dzēsti no šīs ierīces, taču tie paliks jūsu Google kontā.</translation>
 <translation id="4555020257205549924">Ja šī funkcija ir ieslēgta, Chromium piedāvā tulkot citās valodās rakstītas lapas, izmantojot Google tulkotāju. <ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" />.</translation>
 <translation id="4681781466797808448">Ieslēgt Chromium skeneri</translation>
 <translation id="4787850887676698916">Šeit būs redzamas cilnes, kuras esat atvēris pārlūkā Chromium citās ierīcēs.</translation>
 <translation id="4999538639245140991">Jūs izrakstāties no konta, kas tiek pārvaldīts domēnā <ph name="SIGNOUT_MANAGED_DOMAIN" />, tādēļ jūsu Chromium dati tiks dzēsti no šīs ierīces. Dati joprojām būs pieejami jūsu Google kontā.</translation>
-<translation id="5231355151045086930">Izrakstīšanās no Chromium</translation>
 <translation id="5862307444128926510">Laipni lūdzam pārlūkā Chromium!</translation>
 <translation id="5945387852661427312">Jūs pierakstāties kontā, kas tiek pārvaldīts domēnā <ph name="DOMAIN" />, un sniedzat tā administratoram kontroli pār saviem Chromium datiem. Jūsu dati tiks neatgriezeniski saistīti ar šo kontu. Izrakstoties no pārlūka Chromium, jūsu dati tiks dzēsti no šīs ierīces, taču tie tiks saglabāti jūsu Google kontā.</translation>
 <translation id="6068866989048414399">Chromium pakalpojumu sniegšanas noteikumi</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb
index e434c35..8ec2094 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Chromium-ലേക്ക് പകർത്തി</translation>
 <translation id="3605252743693911722">നിങ്ങളുടെ ബുക്ക്‌മാർക്കുകളും  ‌പാസ്‌വേഡുകളും മറ്റും എല്ലാ ഉപകരണങ്ങളിലും ലഭ്യമാക്കുന്നതിന് Chromium-ൽ സൈൻ ഇൻ ചെയ്യുക.</translation>
 <translation id="3805899903892079518">Chromium-ത്തിന് നിങ്ങളുടെ ഫോട്ടോകളിലേക്കോ വീഡിയോകളിലേക്കോ ആക്‌സസ് ഇല്ല. iOS ക്രമീകരണം &gt; സ്വകാര്യത &gt; ഫോട്ടോകൾ എന്നതിൽ ആക്‌സസ് പ്രവർത്തനക്ഷമമാക്കുക.</translation>
-<translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" /> മാനേജ് ചെയ്യുന്ന അക്കൗണ്ടിൽ നിന്നും നിങ്ങൾ സൈൻ ഔട്ട് ചെയ്യുകയാണ്. ഇത് ഈ ഉപകരണത്തിൽ നിന്ന് നിങ്ങളുടെ Chromium വിവരങ്ങൾ ഇല്ലാതാക്കുമെങ്കിലും, Google അക്കൗണ്ടിൽ തുടർന്നും അവ ഉണ്ടായിരിക്കുന്നതാണ്.</translation>
 <translation id="4555020257205549924">ഈ ഫീച്ചർ ഓണായിരിക്കുമ്പോൾ, മറ്റ് ഭാഷകളിൽ എഴുതിയിരിക്കുന്ന പേജുകൾ Google വിവർത്തനം ഉപയോഗിച്ച് വിവർത്തനം ചെയ്യുന്നത് Chromium ഓഫർ ചെയ്യും. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Chromium സ്‌കാനർ ഓണാക്കുക</translation>
 <translation id="4787850887676698916">നിങ്ങളുടെ മറ്റ് ഉപകരണങ്ങളിലെ Chromium-ത്തിൽ തുറന്ന ടാബുകൾ ഇവിടെ ദൃശ്യമാകും.</translation>
 <translation id="4999538639245140991"><ph name="SIGNOUT_MANAGED_DOMAIN" /> മാനേജ് ചെയ്യുന്ന ഒരു അക്കൗണ്ടിൽ നിന്നും നിങ്ങള്‍ സൈൻ ഔട്ട് ചെയ്യുന്നത് കാരണം, ഈ ഉപകരണത്തില്‍ നിന്ന് Chromium ഡാറ്റ ഇല്ലാതാക്കപ്പെടും. നിങ്ങളുടെ ഡാറ്റ തുടര്‍ന്നും Google അക്കൗണ്ടില്‍ ഉണ്ടായിരിക്കും.</translation>
-<translation id="5231355151045086930">Chromium-ത്തിൽ നിന്ന് സൈൻ ഔട്ട് ചെയ്യുക</translation>
 <translation id="5862307444128926510">Chromium-ത്തിലേക്ക് സ്വാഗതം</translation>
 <translation id="5945387852661427312"><ph name="DOMAIN" /> മാനേജ് ചെയ്യുന്ന അക്കൗണ്ട് ഉപയോഗിച്ച് നിങ്ങൾ സൈൻ ഇൻ ചെയ്യുകയും ഇതിന്റെ അഡ്‌മിൻ നിങ്ങളുടെ Chromium വിവരങ്ങളിന്മേൽ നിയന്ത്രണം നൽകുകയും ചെയ്യുന്നു. വിവരങ്ങളെ ഈ അക്കൗണ്ടുമായി ശാശ്വതമായി ബന്ധിപ്പിക്കും. Chromium-ത്തിൽ നിന്ന് സൈൻ ഔട്ട് ചെയ്യുന്നത് ഈ ഉപകരണത്തിൽ നിന്ന് നിങ്ങളുടെ വിവരങ്ങളെ ഇല്ലാതാക്കുമെങ്കിലും, Google അക്കൗണ്ടിൽ തുടർന്നും അവ സൂക്ഷിക്കുന്നതാണ്.</translation>
 <translation id="6068866989048414399">Chromium സേവന നിബന്ധനകൾ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_mr.xtb
index 2e91889..fd36e12b 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_mr.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_mr.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Chromium वर कॉपी केले</translation>
 <translation id="3605252743693911722">तुमच्या सर्व डिव्हाइसवर तुमचे बुकमार्क, पासवर्ड आणि अधिक मिळवण्यासाठी Chromiumमध्ये साइन इन करा.</translation>
 <translation id="3805899903892079518">Chromium ला तुमच्या फोटो किंवा व्हिडिओ अॅक्सेस नाही. iOS सेटिंग्ज&gt; गोपनीयता&gt; फोटो  अॅक्सेस सक्षम करा.</translation>
-<translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" /> द्वारे व्यवस्थापित केलेल्या खात्यामधून तुम्ही साइन आउट करीत आहात. हे तुमचा Chromium डेटा या डिव्हाइस वरून हटवेल परंतु तुमचा डेटा आपल्या Google खात्यामध्ये असेल.</translation>
 <translation id="4555020257205549924">हे वैशिष्ट्य चालू केल्यावर, Chromium Google भाषांतर वापरून अन्य भाषामध्ये लिहिलेल्या पृष्ठांचा भाषांतर ऑफर करेल. <ph name="BEGIN_LINK" />अधिक जाणून घ्या<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Chromium स्कॅनर सुरू करा</translation>
 <translation id="4787850887676698916">आपल्या अन्य डिव्हाइसवर तुम्ही Chromium मध्ये उघडलेले टॅब येथे दिसतील.</translation>
 <translation id="4999538639245140991">तुम्ही <ph name="SIGNOUT_MANAGED_DOMAIN" /> द्वारे व्यवस्थापित केलेल्या खात्यातून साइन आउट केले आहे, तुमचा Chromium डेटा या डिव्हाइसवरून हटवला जाईल. तुमचा डेटा तुमच्या Google खाते मध्ये असेल.</translation>
-<translation id="5231355151045086930">Chromium मधून साइन आउट करा</translation>
 <translation id="5862307444128926510">Chromium वर तुमचे स्‍वागत आहे</translation>
 <translation id="5945387852661427312"><ph name="DOMAIN" /> द्वारे व्यवस्थापित केलेल्या खात्यासह तुम्ही साइन इन करत आहात आणि त्याच्या अॅडमिनिस्ट्रेटरला तुमच्या Chromium डेटाचे नियंत्रण देत आहात. तुमचा डेटा कायमचा या खात्यामध्ये असेल. Chromium मधून साइन आउट केल्याने तुमचा डेटा या डिव्हाइस वरून हटवला जाईल परंतु तो तुमच्या Google खात्यामध्ये स्टोअर केलेला असेल.</translation>
 <translation id="6068866989048414399">Chromium सेवा अटी</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb
index a78c69dd..746fd1e9 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Disalin ke Chromium</translation>
 <translation id="3605252743693911722">Log masuk ke Chromium untuk mendapatkan penanda halaman, kata laluan anda dan pelbagai lagi pada semua peranti anda.</translation>
 <translation id="3805899903892079518">Chromium tidak mempunyai akses kepada foto atau video anda. Dayakan akses dalam Tetapan iOS &gt; Privasi &gt; Foto.</translation>
-<translation id="4241912885070669028">Anda mengelog keluar daripada akaun yang diurus oleh <ph name="SIGNOUT_MANAGED_DOMAIN" />. Tindakan ini akan memadamkan data Chromium anda daripada peranti ini, tetapi data anda akan kekal dalam akaun Google anda.</translation>
 <translation id="4555020257205549924">Apabila ciri ini dihidupkan, Chromium akan menawarkan untuk menterjemah halaman yang ditulis dalam bahasa lain menggunakan Terjemahan Google. <ph name="BEGIN_LINK" />Ketahui lebih lanjut<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Hidupkan pengimbas Chromium</translation>
 <translation id="4787850887676698916">Tab yang telah dibuka dalam Chromium pada peranti anda yang lain akan dipaparkan di sini.</translation>
 <translation id="4999538639245140991">Oleh sebab anda log keluar daripada akaun yang diurus oleh <ph name="SIGNOUT_MANAGED_DOMAIN" />, data Chromium anda akan dipadamkan daripada peranti ini. Data anda akan kekal dalam Akaun Google anda.</translation>
-<translation id="5231355151045086930">Log keluar daripada Chromium</translation>
 <translation id="5862307444128926510">Selamat datang ke Chromium</translation>
 <translation id="5945387852661427312">Anda mengelog masuk dengan akaun yang diurus oleh <ph name="DOMAIN" /> dan memberi kawalan terhadap data Chromium anda kepada pentadbirnya. Data anda akan terikat secara kekal kepada akaun ini. Tindakan mengelog keluar daripada Chromium akan memadamkan data anda daripada peranti ini, tetapi data itu akan kekal disimpan dalam Akaun Google anda.</translation>
 <translation id="6068866989048414399">Syarat Perkhidmatan Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb
index 1ea6630..cf4b720 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Gekopieerd naar Chromium</translation>
 <translation id="3605252743693911722">Log in bij Chromium om je bladwijzers, wachtwoorden en meer op al je apparaten te gebruiken.</translation>
 <translation id="3805899903892079518">Chromium heeft geen toegang tot je foto's of video's. Schakel toegang in via iOS-instellingen &gt; Privacy &gt; Foto's.</translation>
-<translation id="4241912885070669028">Je logt uit van een account dat wordt beheerd door <ph name="SIGNOUT_MANAGED_DOMAIN" />. Hierdoor worden je Chromium-gegevens verwijderd van dit apparaat. Je gegevens blijven echter opgeslagen in je Google-account.</translation>
 <translation id="4555020257205549924">Als deze functie is ingeschakeld, biedt Chromium aan pagina's die zijn geschreven in andere talen te vertalen met Google Translate. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Chromium-scanner inschakelen</translation>
 <translation id="4787850887676698916">Tabbladen die je op andere apparaten in Chromium hebt geopend, worden hier weergegeven.</translation>
 <translation id="4999538639245140991">Omdat je uitlogt van een account dat wordt beheerd door <ph name="SIGNOUT_MANAGED_DOMAIN" />, worden je Chromium-gegevens van dit apparaat verwijderd. Je gegevens blijven echter wel in je Google-account staan.</translation>
-<translation id="5231355151045086930">Uitloggen bij Chromium</translation>
 <translation id="5862307444128926510">Welkom bij Chromium</translation>
 <translation id="5945387852661427312">Je logt in met een account dat wordt beheerd door <ph name="DOMAIN" />, waarmee je de eigenaar beheer geeft over je Chromium-gegevens. Je gegevens worden permanent gekoppeld aan dit account. Als je uitlogt van Chromium, worden je gegevens van dit apparaat verwijderd. Ze blijven echter opgeslagen in je Google-account.</translation>
 <translation id="6068866989048414399">Servicevoorwaarden van Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb
index 39076a1..28c8f8a 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Kopiert til Chromium</translation>
 <translation id="3605252743693911722">Logg på Chromium for å hente blant annet bokmerkene og passordene dine på alle enhetene du bruker.</translation>
 <translation id="3805899903892079518">Chromium har ikke tilgang til bildene eller videoene dine. Slå på tilgangen i iOS-innstillingene &gt; Personvern &gt; Bilder.</translation>
-<translation id="4241912885070669028">Du logger av en konto som administreres av <ph name="SIGNOUT_MANAGED_DOMAIN" />. Dette fører til at Chromium-dataene dine slettes fra denne enheten, men de blir værende i Google-kontoen din.</translation>
 <translation id="4555020257205549924">Når denne funksjonen er slått på, tilbyr Chromium å oversette sider som er skrevet på andre språk, ved hjelp av Google Oversetter. <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Slå på Chromium-skanneren</translation>
 <translation id="4787850887676698916">Faner du har åpnet i Chromium på de andre enhetene dine, vises her.</translation>
 <translation id="4999538639245140991">Fordi du logger av en konto som er administrert av <ph name="SIGNOUT_MANAGED_DOMAIN" />, blir Chromium-dataene dine slettet fra denne enheten, men de blir værende i Google-kontoen din.</translation>
-<translation id="5231355151045086930">Vil du logge av Chromium?</translation>
 <translation id="5862307444128926510">Velkommen til Chromium</translation>
 <translation id="5945387852661427312">Du logger på med en konto som administreres av <ph name="DOMAIN" />, og du gir dermed administratoren for dette domenet kontroll over Chromium-dataene dine. Dataene dine blir knyttet til denne kontoen permanent. Når du logger av Chromium, slettes dataene dine fra denne enheten, men de er fortsatt lagret i Google-kontoen din.</translation>
 <translation id="6068866989048414399">Vilkår for Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb
index 3d6b26f..5423324 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Skopiowana do Chromium</translation>
 <translation id="3605252743693911722">Zaloguj się w Chromium, by mieć dostęp do swoich zakładek, haseł i innych ustawień na wszystkich swoich urządzeniach.</translation>
 <translation id="3805899903892079518">Chromium nie ma dostępu do Twoich zdjęć ani filmów. Aby włączyć dostęp w iOS, wybierz Ustawienia &gt; Prywatność &gt; Zdjęcia.</translation>
-<translation id="4241912885070669028">Wylogowujesz się z konta, którym zarządza <ph name="SIGNOUT_MANAGED_DOMAIN" />. Spowoduje to usunięcie danych Chromium z tego urządzenia, ale pozostaną one na koncie Google.</translation>
 <translation id="4555020257205549924">Gdy ta funkcja jest włączona, Chromium oferuje tłumaczenie stron w innych językach przy użyciu Tłumacza Google. <ph name="BEGIN_LINK" />Więcej informacji<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Włącz skaner Chromium</translation>
 <translation id="4787850887676698916">Tutaj wyświetlą się karty otwarte w Chromium na innych urządzeniach.</translation>
 <translation id="4999538639245140991">Wylogowujesz się z konta, którym zarządza <ph name="SIGNOUT_MANAGED_DOMAIN" />. Spowoduje to usunięcie danych Chromium z tego urządzenia, ale pozostaną one na koncie Google.</translation>
-<translation id="5231355151045086930">Wylogowanie z Chromium</translation>
 <translation id="5862307444128926510">Chromium – witamy!</translation>
 <translation id="5945387852661427312">Logujesz się na konto, którym zarządza <ph name="DOMAIN" />, i przekazujesz jego administratorowi kontrolę nad Twoimi danymi Chromium. Zostaną one trwale przypisane do tego konta. Gdy się wylogujesz, znikną one z tego urządzenia, ale pozostaną zapisane na Twoim koncie Google.</translation>
 <translation id="6068866989048414399">Warunki korzystania z Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb
index 60191345..9118e11 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Copiado no Chromium</translation>
 <translation id="3605252743693911722">Faça login no Chromium para ver seus favoritos, senhas e muito mais em todos os seus dispositivos.</translation>
 <translation id="3805899903892079518">O Chromium não têm acesso às suas fotos ou seus vídeos. Permita o acesso em "Configurações do iOS" &gt; "Privacidade" &gt; "Fotos".</translation>
-<translation id="4241912885070669028">Você está saindo de uma conta gerenciada por <ph name="SIGNOUT_MANAGED_DOMAIN" />. Os dados do Chromium serão excluídos deste dispositivo, mas permanecerão na sua Conta do Google.</translation>
 <translation id="4555020257205549924">Quando este recurso está ativado, o Chromium oferece a tradução de páginas escritas em outros idiomas usando o Google Tradutor. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Ativar o leitor do Chromium</translation>
 <translation id="4787850887676698916">As guias abertas no Chromium nos outros dispositivos aparecerão aqui.</translation>
 <translation id="4999538639245140991">Como você está saindo de uma conta gerenciada por <ph name="SIGNOUT_MANAGED_DOMAIN" />, os dados do Chromium serão excluídos deste dispositivo, mas permanecerão na sua Conta do Google.</translation>
-<translation id="5231355151045086930">Sair do Chromium</translation>
 <translation id="5862307444128926510">Bem-vindo ao Chromium</translation>
 <translation id="5945387852661427312">Você está fazendo login com uma conta gerenciada por <ph name="DOMAIN" /> e dando ao administrador dela o controle sobre seus dados do Chromium, os quais ficarão permanentemente vinculados a essa conta. Se você sair do Chromium, seus dados serão excluídos deste dispositivo, mas permanecerão armazenados na sua Conta do Google.</translation>
 <translation id="6068866989048414399">Termos de Serviço do Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_pt-PT.xtb
index 99be6a9..d00eabf4 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_pt-PT.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_pt-PT.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Copiado para o Chromium</translation>
 <translation id="3605252743693911722">Inicie sessão no Chromium para obter os seus marcadores, palavras-passe e muito mais em todos os dispositivos.</translation>
 <translation id="3805899903892079518">O Chromium não tem acesso aos seus vídeos ou fotos. Ative o acesso nas Definições do iOS &gt; Privacidade &gt; Fotos.</translation>
-<translation id="4241912885070669028">Está a terminar sessão numa conta gerida por <ph name="SIGNOUT_MANAGED_DOMAIN" />. Esta ação elimina os seus dados do Chromium deste dispositivo, embora permaneçam na Conta Google.</translation>
 <translation id="4555020257205549924">Se esta funcionalidade estiver ativada, o Chromium oferecer-se-á para traduzir páginas escritas noutros idiomas com o Google Tradutor. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Ative o leitor do Chromium</translation>
 <translation id="4787850887676698916">Os separadores que abriu no Chromium nos seus outros dispositivos são apresentados aqui.</translation>
 <translation id="4999538639245140991">Uma vez que está a terminar sessão numa conta gerida por <ph name="SIGNOUT_MANAGED_DOMAIN" />, os seus dados do Chromium serão eliminados deste dispositivo. Contudo, permanecem na sua Conta Google.</translation>
-<translation id="5231355151045086930">Terminar sessão no Chromium</translation>
 <translation id="5862307444128926510">Bem-vindo ao Chromium</translation>
 <translation id="5945387852661427312">Está a iniciar sessão com uma conta gerida por <ph name="DOMAIN" /> e a conceder ao respetivo gestor o controlo dos seus dados do Chromium. Os dados ficarão permanentemente associados a esta conta. Terminar sessão no Chromium elimina os seus dados deste dispositivo, embora permaneçam armazenados na Conta Google.</translation>
 <translation id="6068866989048414399">Termos de Utilização do Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb
index ab188d7d..66577b1 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Copiat în Chromium</translation>
 <translation id="3605252743693911722">Conectează-te la Chromium pentru a accesa marcajele, parolele și altele pe toate dispozitivele tale.</translation>
 <translation id="3805899903892079518">Chromium nu are acces la fotografii și videoclipuri. Activează accesul din Setări iOS &gt; Confidențialitate &gt; Fotografii.</translation>
-<translation id="4241912885070669028">Te deconectezi de la un cont gestionat de <ph name="SIGNOUT_MANAGED_DOMAIN" />. Astfel, datele Chromium vor fi șterse de pe acest dispozitiv, dar vor rămâne în Contul Google.</translation>
 <translation id="4555020257205549924">Când această funcție este activată, Chromium se va oferi să traducă paginile scrise în alte limbi utilizând Google Traducere. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Activează scanerul din Chromium</translation>
 <translation id="4787850887676698916">Filele deschise în Chromium pe alte dispozitive vor apărea aici.</translation>
 <translation id="4999538639245140991">Deoarece te deconectezi de la un cont gestionat de <ph name="SIGNOUT_MANAGED_DOMAIN" />, datele tale Chromium de pe acest dispozitiv vor fi șterse. Datele tale vor rămâne în Contul Google.</translation>
-<translation id="5231355151045086930">Deconectează-te de la Chromium</translation>
 <translation id="5862307444128926510">Bun venit la Chromium</translation>
 <translation id="5945387852661427312">Te conectezi cu un cont gestionat de <ph name="DOMAIN" /> și acorzi administratorului acestuia controlul asupra datelor Chromium. Datele vor fi asociate definitiv acestui cont. Dacă te deconectezi de la Chromium, datele vor fi șterse de pe acest dispozitiv, dar vor rămâne stocate în Contul Google.</translation>
 <translation id="6068866989048414399">Termenii și condițiile Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ru.xtb
index c6e68fa4..c65ea3b 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ru.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Скопировано в Chromium</translation>
 <translation id="3605252743693911722">Войдите в Chromium, чтобы синхронизировать закладки, пароли и другую информацию на всех ваших устройствах.</translation>
 <translation id="3805899903892079518">У Chromium нет доступа к вашим фото и видео. Чтобы предоставить его, нажмите "Настройки &gt; Конфиденциальность &gt; Фотографии".</translation>
-<translation id="4241912885070669028">Вы выходите из аккаунта, которым управляет администратор домена <ph name="SIGNOUT_MANAGED_DOMAIN" />. Обратите внимание, что данные Chromium будут удалены с устройства, но сохранятся в аккаунте Google.</translation>
 <translation id="4555020257205549924">Когда эта функция включена, Chrome предлагает перевести страницы с помощью Google Переводчика. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Включить сканер в Chromium</translation>
 <translation id="4787850887676698916">Здесь появятся вкладки, открытые в Chromium на других устройствах.</translation>
 <translation id="4999538639245140991">Вы выходите из аккаунта, которым управляет администратор домена <ph name="SIGNOUT_MANAGED_DOMAIN" />. Обратите внимание, что данные Chromium будут удалены с устройства, но останутся в вашем аккаунте Google.</translation>
-<translation id="5231355151045086930">Выйти из Chromium</translation>
 <translation id="5862307444128926510">Добро пожаловать в Chromium</translation>
 <translation id="5945387852661427312">Вы входите в аккаунт, которым управляет администратор домена <ph name="DOMAIN" />. Он может контролировать ваши данные Chromium, которые теперь будут связаны с управляемым аккаунтом. При выходе из системы все данные Chromium, хранящиеся на этом устройстве, будут удалены, но останутся в вашем аккаунте Google.</translation>
 <translation id="6068866989048414399">Условия использования Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sk.xtb
index ceeb9dc..5072f6f7 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sk.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sk.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Skopírovaná do prehliadača Chromium</translation>
 <translation id="3605252743693911722">Prihláste sa do prehliadača Chromium a získajte svoje záložky, heslá a ďalšie nastavenia na všetkých zariadeniach.</translation>
 <translation id="3805899903892079518">Chromium nemá prístup k vašim fotkám ani videám. Prístup povoľte v časti Nastavenia systému iOS &gt; Súkromie &gt; Fotky.</translation>
-<translation id="4241912885070669028">Odhlasujete sa z účtu spravovaného doménou <ph name="SIGNOUT_MANAGED_DOMAIN" />. Touto akciou odstránite údaje prehliadača Chromium z príslušného zariadenia, avšak zostanú naďalej vo vašom účte Google.</translation>
 <translation id="4555020257205549924">Po zapnutí tejto funkcie bude prehliadač Chromium ponúkať preloženie stránok napísaných v inom jazyku pomocou Prekladača Google. <ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Zapnutie skenera prehliadača Chromium</translation>
 <translation id="4787850887676698916">Tu sa zobrazia karty, ktoré ste otvorili v prehliadači Chromium na iných zariadeniach.</translation>
 <translation id="4999538639245140991">Odhlasujete sa z účtu spravovaného doménou <ph name="SIGNOUT_MANAGED_DOMAIN" />, takže údaje prehliadača Chromium budú z tohto zariadenia odstránené. Vaše údaje zostanú vo vašom účte Google.</translation>
-<translation id="5231355151045086930">Odhlásenie sa z prehliadača Chromium</translation>
 <translation id="5862307444128926510">Vitajte v prehliadači Chromium</translation>
 <translation id="5945387852661427312">Prihlasujete sa pomocou účtu spravovaného doménou <ph name="DOMAIN" /> a jej správcovi tým dávate kontrolu nad vašimi údajmi prehliadača Chromium. Vaše údaje budú natrvalo prepojené s týmto účtom. Odhlásením z prehliadača Chromium odstránite údaje z príslušného zariadenia, avšak naďalej zostanú uložené vo vašom účte Google.</translation>
 <translation id="6068866989048414399">Zmluvné podmienky prehliadača Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb
index ac03e10..399a0869 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb
@@ -23,12 +23,10 @@
 <translation id="3256316712990552818">Kopirano v Chromium</translation>
 <translation id="3605252743693911722">Prijavite se v Chromium, če želite dostopati do svojih zaznamkov, gesel in drugega v vseh napravah.</translation>
 <translation id="3805899903892079518">Chromium nima dostopa do fotografij ali videoposnetkov. Omogočite dostop v sistemu iOS: Settings &gt; Privacy &gt; Photos.</translation>
-<translation id="4241912885070669028">Odjavili se boste iz računa, ki ga upravlja <ph name="SIGNOUT_MANAGED_DOMAIN" />. S tem boste iz te naprave izbrisali podatke v Chromiumu, vendar bodo vaši podatki še vedno na voljo v Google Računu.</translation>
 <translation id="4555020257205549924">Kadar je vklopljena ta funkcija, bo Chromium ponudil, da z uporabo Google Prevajalnika prevede strani v drugih jezikih. <ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Vklopite optični bralnik Chromium</translation>
 <translation id="4787850887676698916">Zavihki, ki ste jih odprli v Chromiumu v drugih napravah, bodo prikazani tukaj.</translation>
 <translation id="4999538639245140991">Ker se boste odjavili iz računa, ki ga upravlja <ph name="SIGNOUT_MANAGED_DOMAIN" />, boste iz te naprave izbrisali podatke v Chromiumu. Vaši podatki bodo še vedno na voljo v Google Računu.</translation>
-<translation id="5231355151045086930">Odjava iz Chromiuma</translation>
 <translation id="5862307444128926510">Pozdravljeni v Chromiumu</translation>
 <translation id="5945387852661427312">Prijavljate se z računom, ki ga upravlja <ph name="DOMAIN" />, in nadzor nad podatki v Chromiumu predajate skrbniku. Vaši podatki bodo trajno povezani s tem računom. Če se odjavite iz Chromiuma, boste izbrisali podatke iz te naprave, vendar bodo še naprej shranjeni v Google Računu.</translation>
 <translation id="6068866989048414399">Pogoji storitve za Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb
index a926c96a..0fc441f 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Копирана у Chromium</translation>
 <translation id="3605252743693911722">Пријавите се у Chromium да би вам обележивачи, лозинке и други садржај били доступни на свим уређајима.</translation>
 <translation id="3805899903892079518">Chromium не може да приступа сликама или видео снимцима. Омогућите приступ у iOS Settings (Подешавања iOS-а) &gt; Privacy (Приватност) &gt; Photos (Слике).</translation>
-<translation id="4241912885070669028">Одјављујете се са налога којим управља <ph name="SIGNOUT_MANAGED_DOMAIN" />. То ће избрисати Chromium податке са овог уређаја, али ће подаци остати на Google налогу.</translation>
 <translation id="4555020257205549924">Када је ова функција укључена, Chromium ће нудити да преводи странице написане на другим језицима помоћу Google преводиоца. <ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Укључите Chromium скенер</translation>
 <translation id="4787850887676698916">Овде ће се приказати картице које сте отворили у Chromium-у на другим уређајима.</translation>
 <translation id="4999538639245140991">Одјављујете се са налога којим управља <ph name="SIGNOUT_MANAGED_DOMAIN" />, што ће избрисати Chromium податке са овог уређаја. Подаци ће остати на Google налогу.</translation>
-<translation id="5231355151045086930">Одјавите се из Chromium-а</translation>
 <translation id="5862307444128926510">Добро дошли у Chromium</translation>
 <translation id="5945387852661427312">Пријављујете се помоћу налога којим управља <ph name="DOMAIN" /> и дајете његовом администратору контролу над својим Chromium подацима. Подаци ће постати трајно повезани са тим налогом. Одјављивањем из Chromium-а ћете избрисати податке са овог уређаја, али ће они остати сачувани на Google налогу.</translation>
 <translation id="6068866989048414399">Chromium услови коришћења услуге</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sv.xtb
index 98b33b8..dcf6422b 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sv.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sv.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Kopierat till Chromium</translation>
 <translation id="3605252743693911722">Logga in i Chromium om du vill få dina bokmärken, lösenord med mera på alla dina enheter.</translation>
 <translation id="3805899903892079518">Chromium har inte åtkomst till dina foton eller videor. Aktivera åtkomst i iOS-inställningar &gt; Sekretess &gt; Foton.</translation>
-<translation id="4241912885070669028">Du håller på att logga ut från ett konto som hanteras av <ph name="SIGNOUT_MANAGED_DOMAIN" />. Åtgärden raderar din data i Chromium från den här enheten, men den finns kvar på Google-kontot.</translation>
 <translation id="4555020257205549924">När den här funktionen har aktiverats visas alternativet i Chromium att översätta sidor som är skrivna på andra språk med hjälp av Google Översätt. <ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Aktivera Chromium som skanner</translation>
 <translation id="4787850887676698916">Här visas flikar som du har öppnat i Chromium på andra enheter.</translation>
 <translation id="4999538639245140991">Din data i Chromium raderas från den här enheten eftersom du loggar ut från ett konto som hanteras av <ph name="SIGNOUT_MANAGED_DOMAIN" />. Din data finns kvar i Google-kontot.</translation>
-<translation id="5231355151045086930">Logga ut från Chromium</translation>
 <translation id="5862307444128926510">Välkommen till Chromium</translation>
 <translation id="5945387852661427312">Du håller på att logga in med ett konto som hanteras av <ph name="DOMAIN" /> vilket ger administratören kontroll över data i Chromium. Din data kopplas permanent till det här kontot. Om du loggar ut från Chromium raderas all din data från enheten, men den lagras fortfarande på Google-kontot.</translation>
 <translation id="6068866989048414399">Användarvillkor för Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sw.xtb
index 69d31cb..0cd275d 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sw.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sw.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Imenakiliwa kwenye Chromium</translation>
 <translation id="3605252743693911722">Ingia katika Chromium ili upate alamisho, manenosiri yako na mengine mengi kwenye vifaa vyako vyote.</translation>
 <translation id="3805899903892079518">Chromium haina uwezo wa kufikia picha au video zako. Washa uwezo wa kufikia katika Mipangilio ya iOS &gt; Faragha &gt; Picha.</translation>
-<translation id="4241912885070669028">Unaondoka kwenye akaunti inayodhibitiwa na <ph name="SIGNOUT_MANAGED_DOMAIN" />. Hatua hii itafuta data yako ya Chromium kwenye kifaa hiki, lakini data yako itasalia katika akaunti yako ya Google.</translation>
 <translation id="4555020257205549924">Kipengele hiki kikiwashwa, Chromium itatafsiri kurasa zilizoandikwa kwa lugha nyingine kwa kutumia Google Tafsiri. <ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Washa kichanganuzi cha Chromium</translation>
 <translation id="4787850887676698916">Vichupo ambayo umefungua katika Chromium kwenye vifaa vyako vingine vitaonekana hapa.</translation>
 <translation id="4999538639245140991">Kwa sababu unaondoka kwenye akaunti inayodhibitiwa na <ph name="SIGNOUT_MANAGED_DOMAIN" />, data yako ya Chromium itafutwa kwenye kifaa hiki, lakini itasalia katika Akaunti yako ya Google.</translation>
-<translation id="5231355151045086930">Ondoka kwenye Chromium</translation>
 <translation id="5862307444128926510">Karibu kwenye Chromium</translation>
 <translation id="5945387852661427312">Unaingia kwa kutumia akaunti inayodhibitiwa na <ph name="DOMAIN" /> na kumpa msimamizi wa kikoa hicho udhibiti wa data yako ya Chromium. Data yako ya Chromium itahusishwa na akaunti hii daima. Kuondoka kwenye Chromium kutafuta data yako kwenye kifaa hiki, lakini itaendelea kuhifadhiwa katika Akaunti yako ya Google.</translation>
 <translation id="6068866989048414399">Sheria na Masharti ya Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb
index 0044e0d8..81d53b87 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Chromium இல் நகலெடுக்கப்பட்டது</translation>
 <translation id="3605252743693911722">உங்கள் எல்லாச் சாதனங்களிலும் உங்கள் புக்மார்க்குகள், கடவுச்சொற்கள் மற்றும் பலவற்றைப் பெற, Chromium இல் உள்நுழையவும்.</translation>
 <translation id="3805899903892079518">Chromiumமுக்குப் படங்களையோ வீடியோக்களையோ அணுக அனுமதி இல்லை. அணுகலை 'iOS அமைப்புகள் &gt; தனியுரிமை &gt; படங்கள்' என்பதில் இயக்கவும்.</translation>
-<translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" /> நிர்வகிக்கும் கணக்கிலிருந்து வெளியேறுகிறீர்கள். இவ்வாறு செய்வதால், இந்தச் சாதனத்திலிருந்து Chromium தரவு நீக்கப்படும், எனினும் உங்கள் Google கணக்கில் தரவு தொடர்ந்து இருக்கும்.</translation>
 <translation id="4555020257205549924">இந்த அம்சம் இயக்கப்பட்டிருக்கும் போது, பிற மொழிகளில் எழுதப்பட்டுள்ள பக்கங்களை Google மொழியாக்கத்தைப் பயன்படுத்தி, உங்கள் மொழியில் மொழிபெயர்த்துக்கொள்ளும் வசதியை Chromium வழங்கும். <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Chromium ஸ்கேனரை ஆன் செய்யவும்</translation>
 <translation id="4787850887676698916">உங்கள் பிற சாதனங்களில் Chromium மூலம் திறந்த தாவல்கள் இங்கே தோன்றும்.</translation>
 <translation id="4999538639245140991">நீங்கள் <ph name="SIGNOUT_MANAGED_DOMAIN" /> நிர்வகிக்கும் கணக்கிலிருந்து வெளியேறுவதால், இந்தச் சாதனத்திலிருந்து உங்கள் Chromium தரவு நீக்கப்படும். எனினும் உங்கள் Google கணக்கிலிருந்து உங்கள் தரவு நீக்கப்படாது.</translation>
-<translation id="5231355151045086930">Chromium இலிருந்து வெளியேறு</translation>
 <translation id="5862307444128926510">Chromium க்கு வரவேற்கிறோம்</translation>
 <translation id="5945387852661427312"><ph name="DOMAIN" /> நிர்வகிக்கும் கணக்கில் உள்நுழைந்து, உங்கள் Chromium தரவு மீதான கட்டுப்பாட்டை அதன் நிர்வாகிக்கு வழங்குகிறீர்கள். இந்தக் கணக்குடன் தரவு நிரந்தரமாக இணைக்கப்படும். Chromiumமிலிருந்து வெளியேறுவதால், இந்தச் சாதனத்திலிருந்து தரவு நீக்கப்படும், எனினும் உங்கள் Google கணக்கில் தரவு தொடர்ந்து இருக்கும்.</translation>
 <translation id="6068866989048414399">Chromium இன் சேவை விதிமுறைகள்</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_te.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_te.xtb
index 72ececdd..5d85fe1e 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_te.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Chromiumకి కాపీ చేయబడింది</translation>
 <translation id="3605252743693911722">మీ పరికరాలన్నింటిలో మీ బుక్‌మార్క్‌లు, పాస్‌వర్డ్‌లు మరియు మరిన్నింటిని పొందడానికి Chromiumకు సైన్ ఇన్ చేయండి.</translation>
 <translation id="3805899903892079518">Chromium మీ ఫోటోలు లేదా వీడియోలకు యాక్సెస్‌ను కలిగి లేదు. iOS సెట్టింగ్‌లు &gt; గోప్యత &gt; ఫోటోల్లో యాక్సెస్‌ను ప్రారంభించండి.</translation>
-<translation id="4241912885070669028">మీరు <ph name="SIGNOUT_MANAGED_DOMAIN" /> నిర్వహణలో ఉన్న ఖాతా నుండి సైన్ అవుట్ చేస్తున్నారు. దీని వలన మీ Chromium డేటా ఈ పరికరం నుండి తొలగించబడుతుంది, కానీ మీ డేటా మీ Google ఖాతాలో అలాగే ఉంటుంది.</translation>
 <translation id="4555020257205549924">ఈ లక్షణం ప్రారంభించినప్పుడు, Chromium ఇతర భాషల్లో వ్రాసిన పేజీలకు Google అనువాదం ఉపయోగించి అనువాదాన్ని ఆఫర్ చేస్తుంది. <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Chromium స్కానర్‌ను ఆన్ చేయండి</translation>
 <translation id="4787850887676698916">మీరు మీ ఇతర పరికరాల్లోని Chromiumలో తెరిచిన ట్యాబ్‌లు ఇక్కడ చూపబడతాయి.</translation>
 <translation id="4999538639245140991"><ph name="SIGNOUT_MANAGED_DOMAIN" /> నిర్వహిస్తున్న ఖాతా నుండి మీరు సైన్ అవుట్ చేస్తున్నారు కనుక మీ Chromium డేటా ఈ పరికరం నుండి తొలగించబడుతుంది. మీ డేటా మీ Google ఖాతాలో అలాగే ఉంటుంది.</translation>
-<translation id="5231355151045086930">Chromium నుండి సైన్ అవుట్ చేయండి</translation>
 <translation id="5862307444128926510">Chromiumకు స్వాగతం</translation>
 <translation id="5945387852661427312">మీరు <ph name="DOMAIN" /> నిర్వహణలో ఉన్న ఖాతా నుండి సైన్ ఇన్ చేస్తున్నారు. దీని నిర్వాహకునికి మీ Chromium డేటాపై నియంత్రణను అందిస్తున్నారు. మీ డేటా శాశ్వతంగా ఈ ఖాతాకు అనుబంధించబడుతుంది. Chromium నుండి సైన్ అవుట్ చేయడం వలన ఈ పరికరం నుండి మీ డేటా తొలగించబడుతుంది. కానీ ఇది మీ Google ఖాతాలో అలాగే నిల్వ చేయబడి ఉంటుంది.</translation>
 <translation id="6068866989048414399">Chromium సేవా నిబంధనలు</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb
index c7804ec..5c61f08a 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">คัดลอกลงใน Chromium แล้ว</translation>
 <translation id="3605252743693911722">ลงชื่อเข้าใช้ Chromium เพื่อรับบุ๊กมาร์ก รหัสผ่าน และข้อมูลอื่นๆ ในอุปกรณ์ทุกเครื่องของคุณ</translation>
 <translation id="3805899903892079518">Chromium ไม่มีสิทธิ์เข้าถึงรูปภาพหรือวิดีโอของคุณ เปิดใช้การเข้าถึงได้ในการตั้งค่า iOS &gt; ความเป็นส่วนตัว &gt; รูปภาพ</translation>
-<translation id="4241912885070669028">คุณกำลังออกจากระบบบัญชีที่จัดการโดย <ph name="SIGNOUT_MANAGED_DOMAIN" /> การออกจากระบบจะลบข้อมูล Chromium ของคุณออกจากอุปกรณ์เครื่องนี้ แต่ข้อมูลจะยังคงอยู่ในบัญชี Google</translation>
 <translation id="4555020257205549924">เมื่อเปิดฟีเจอร์นี้ Chromium จะเสนอให้แปลหน้าต่างๆ ที่เขียนด้วยภาษาอื่นโดยใช้ Google แปลภาษา <ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">เปิดโปรแกรมสแกนของ Chromium</translation>
 <translation id="4787850887676698916">แท็บที่คุณเปิดไว้ใน Chromium ในอุปกรณ์เครื่องอื่นๆ จะปรากฏที่นี่</translation>
 <translation id="4999538639245140991">เนื่องจากคุณกำลังออกจากระบบบัญชีที่จัดการโดย <ph name="SIGNOUT_MANAGED_DOMAIN" /> ข้อมูล Chromium ของคุณจะถูกลบออกจากอุปกรณ์นี้ แต่ข้อมูลจะยังคงอยู่ในบัญชี Google</translation>
-<translation id="5231355151045086930">ออกจากระบบ Chromium</translation>
 <translation id="5862307444128926510">ยินดีต้อนรับสู่ Chromium</translation>
 <translation id="5945387852661427312">คุณกำลังลงชื่อเข้าใช้ด้วยบัญชีที่จัดการโดย <ph name="DOMAIN" /> และทำให้ผู้ดูแลระบบของโดเมนควบคุมข้อมูล Chromium ของคุณได้ ข้อมูลของคุณจะโยงกับบัญชีนี้อย่างถาวร การออกจากระบบ Chromium จะลบข้อมูลของคุณจากอุปกรณ์เครื่องนี้ แต่ข้อมูลจะยังจัดเก็บอยู่ในบัญชี Google</translation>
 <translation id="6068866989048414399">ข้อกำหนดในการให้บริการ Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb
index 8db0044..e8bce5a9 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Chromium'a kopyalandı</translation>
 <translation id="3605252743693911722">Tüm cihazlarınızda yer işaretlerinizi, şifrelerinizi almak ve daha pek çok şey yapmak için Chromium'da oturum açın.</translation>
 <translation id="3805899903892079518">Chromium, fotoğraflarınıza veya videolarınıza erişemiyor. iOS Ayarlar &gt; Gizlilik &gt; Fotoğraflar'dan erişimi etkinleştirin.</translation>
-<translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" /> tarafından yönetilen bir hesabın oturumunu kapatıyorsunuz. Bu işlemle Chromium verileriniz bu cihazdan silinir, ancak Google hesabınızda kalmaya devam eder.</translation>
 <translation id="4555020257205549924">Bu özellik açık durumdayken Chromium, diğer dillerde yazılmış sayfaları Google Çeviri'yi kullanarak çevirmeyi teklif eder. <ph name="BEGIN_LINK" />Daha fazla bilgi<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Chromium tarayıcıyı açın</translation>
 <translation id="4787850887676698916">Diğer cihazlarınızda Chromium'da açtığınız sekmeler burada görünür.</translation>
 <translation id="4999538639245140991"><ph name="SIGNOUT_MANAGED_DOMAIN" /> tarafından yönetilen bir hesabın oturumunu kapattığınız için Chromium verileriniz bu cihazdan silinecek. Ancak verileriniz Google Hesabınızda kalmaya devam edecek.</translation>
-<translation id="5231355151045086930">Chromium oturumunu kapatın</translation>
 <translation id="5862307444128926510">Chromium'a Hoş Geldiniz</translation>
 <translation id="5945387852661427312"><ph name="DOMAIN" /> tarafından yönetilen bir hesapla oturum açıyor ve yöneticiye tüm Chromium verileriniz üzerinde denetim olanağı veriyorsunuz. Verileriniz kalıcı olarak bu hesaba bağlanacaktır. Chromium'da oturumu kapattığınızda verileriniz bu cihazdan silinir ancak Google Hesabınızda kalmaya devam eder.</translation>
 <translation id="6068866989048414399">Chromium Hizmet Şartları</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb
index df1070d..d40a265 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Скопійовано в Chromium</translation>
 <translation id="3605252743693911722">Увійдіть в обліковий запис у Chromium, щоб мати доступ до своїх закладок, паролів та інших даних на всіх пристроях.</translation>
 <translation id="3805899903892079518">Chromium не має доступу до ваших фото чи відео. Надайте доступ у меню iOS "Параметри &gt; Конфіденційність &gt; Фото".</translation>
-<translation id="4241912885070669028">Ви виходите з облікового запису, зареєстрованого в домені <ph name="SIGNOUT_MANAGED_DOMAIN" />. Дані Chrome буде видалено з цього пристрою, але вони залишаться у вашому обліковому записі Google.</translation>
 <translation id="4555020257205549924">Якщо ввімкнути цю функцію, Chromium пропонуватиме перекласти сторінки, написані іншими мовами, за допомогою Перекладача Google. <ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Увімкніть сканер у Chromium</translation>
 <translation id="4787850887676698916">Тут відображатимуться вкладки, відкриті в Chromium на інших ваших пристроях.</translation>
 <translation id="4999538639245140991">Оскільки ви виходите з облікового запису, зареєстрованого в домені <ph name="SIGNOUT_MANAGED_DOMAIN" />, ваші дані Chromium буде видалено з цього пристрою. Вони залишаться в обліковому записі Google.</translation>
-<translation id="5231355151045086930">Вийти з Chromium</translation>
 <translation id="5862307444128926510">Вітаємо в Chromium</translation>
 <translation id="5945387852661427312">Ви входите в обліковий запис, зареєстрований у домені <ph name="DOMAIN" />, і надаєте його адміністратору доступ до своїх даних Chromium. Ваші дані буде назавжди зв’язано з цим обліковим записом. Якщо ви вийдете з облікового запису Chromium, дані буде видалено з цього пристрою, але вони залишаться у вашому обліковому записі Google.</translation>
 <translation id="6068866989048414399">Умови використання Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb
index e2776631..6e00348 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">Đã sao chép vào Chromium</translation>
 <translation id="3605252743693911722">Đăng nhập vào Chromium để nhận dấu trang, mật khẩu và nhiều nội dung khác trên tất cả các thiết bị của bạn.</translation>
 <translation id="3805899903892079518">Chromium không có quyền truy cập ảnh hoặc video của bạn. Hãy cho phép truy cập Cài đặt iOS &gt; Bảo mật &gt; Ảnh.</translation>
-<translation id="4241912885070669028">Bạn đang đăng xuất khỏi tài khoản do <ph name="SIGNOUT_MANAGED_DOMAIN" /> quản lý. Thao tác này sẽ xóa dữ liệu Chromium khỏi thiết bị này nhưng dữ liệu đó sẽ vẫn còn trong tài khoản Google của bạn.</translation>
 <translation id="4555020257205549924">Khi tính năng này được bật, Chromium sẽ đề xuất sử dụng Google Dịch để dịch các trang viết bằng ngôn ngữ khác. <ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Bật trình quét của Chromium</translation>
 <translation id="4787850887676698916">Các tab bạn đã mở trong Chromium trên thiết bị khác sẽ xuất hiện tại đây.</translation>
 <translation id="4999538639245140991">Vì bạn đăng xuất khỏi tài khoản do <ph name="SIGNOUT_MANAGED_DOMAIN" /> quản lý, nên dữ liệu Chromium của bạn sẽ bị xóa khỏi thiết bị này. Dữ liệu của bạn sẽ vẫn còn trong Tài khoản Google của bạn.</translation>
-<translation id="5231355151045086930">Đăng xuất khỏi Chromium</translation>
 <translation id="5862307444128926510">Chào mừng bạn đến với Chromium</translation>
 <translation id="5945387852661427312">Bạn đang đăng nhập bằng tài khoản do <ph name="DOMAIN" /> quản lý và cấp cho quản trị viên quyền kiểm soát dữ liệu Chromium của bạn. Dữ liệu của bạn sẽ được liên kết vĩnh viễn với tài khoản này. Đăng xuất khỏi Chromium sẽ xóa dữ liệu của bạn khỏi thiết bị này nhưng dữ liệu đó sẽ vẫn được lưu trữ trong Tài khoản Google.</translation>
 <translation id="6068866989048414399">Điều khoản dịch vụ của Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-CN.xtb
index 42cca5a..97d70a6 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-CN.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-CN.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">已复制到 Chromium</translation>
 <translation id="3605252743693911722">登录 Chromium 即可将您的书签、密码等同步到您的所有设备上。</translation>
 <translation id="3805899903892079518">Chromium 无权访问您的照片或视频。请依次点按 iOS 中的“设置”&gt;“隐私”&gt;“照片”,授予其访问权限。</translation>
-<translation id="4241912885070669028">您正要退出由 <ph name="SIGNOUT_MANAGED_DOMAIN" /> 管理的帐号。退出后,您的 Chromium 数据将从这台设备上删除,但仍会保留在您的 Google 帐号中。</translation>
 <translation id="4555020257205549924">启用此功能后,Chromium 将使用 Google 翻译对其他语言的网页进行翻译。<ph name="BEGIN_LINK" />了解详情<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">开启 Chromium 扫描器</translation>
 <translation id="4787850887676698916">您在其他设备上的 Chromium 中打开的标签页将列在此处。</translation>
 <translation id="4999538639245140991">由于您要退出的帐号是由 <ph name="SIGNOUT_MANAGED_DOMAIN" /> 管理,因此系统将会从这部设备中删除您的 Chromium 数据,但这些数据仍会保留在您的 Google 帐号中。</translation>
-<translation id="5231355151045086930">退出 Chromium</translation>
 <translation id="5862307444128926510">欢迎使用 Chromium</translation>
 <translation id="5945387852661427312">您正要登录由 <ph name="DOMAIN" /> 管理的帐号,并要授权其管理员控制您的 Chromium 数据。您的数据将与此帐号永久关联。退出 Chromium 后,您的数据将从这台设备上删除,但仍会保留在您的 Google 帐号中。</translation>
 <translation id="6068866989048414399">Chromium 服务条款</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb
index 567e04d..5c8d8a5 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb
@@ -22,12 +22,10 @@
 <translation id="3256316712990552818">已複製到 Chromium</translation>
 <translation id="3605252743693911722">無論使用任何裝置,只要登入 Chromium,即可取得你的書籤、密碼,並沿用其他設定。</translation>
 <translation id="3805899903892079518">Chromium 無法存取您的相片或影片,請前往「iOS 設定」中的 [隱私權] &gt; [相片] 啟用存取權。</translation>
-<translation id="4241912885070669028">你即將登出由 <ph name="SIGNOUT_MANAGED_DOMAIN" /> 所管理的帳戶。系統會將你的 Chromium 資料從這個裝置上刪除,但繼續保留在你的 Google 帳戶中。</translation>
 <translation id="4555020257205549924">開啟這項功能後,Chromium 會使用 Google 翻譯來翻譯其他語言的網頁。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">開啟 Chromium 掃描器</translation>
 <translation id="4787850887676698916">你在其他裝置上透過 Chromium 開啟的分頁會顯示在這裡。</translation>
 <translation id="4999538639245140991">由於你即將登出由 <ph name="SIGNOUT_MANAGED_DOMAIN" /> 所管理的帳戶,系統將刪除你在這個裝置上的 Chromium 資料,但這些資料仍會保留在你的 Google 帳戶中。</translation>
-<translation id="5231355151045086930">登出 Chromium</translation>
 <translation id="5862307444128926510">歡迎使用 Chromium</translation>
 <translation id="5945387852661427312">你即將使用由 <ph name="DOMAIN" /> 所管理的帳戶登入,並授權該網域的管理員控管你的 Chromium 資料。你的資料會與這個帳戶建立永久連結。登出 Chromium 後,系統會將你的資料從這個裝置上刪除,但繼續保留在你的 Google 帳戶中。</translation>
 <translation id="6068866989048414399">Chromium 服務條款</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_am.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_am.xtb
index c6825c7..3b3bdcb4c 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_am.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">በአካባቢዎ ላይ በመመስረት የተሻለ የGoogle ተሞክሮ በChrome ውስጥ ያግኙ።</translation>
 <translation id="424864128008805179">ከChrome ተዘግቶ ይወጣ?</translation>
 <translation id="4523886039239821078">አንዳንድ ተጨማሪዎች Chrome እንዲበላሽ ያደርጋሉ። እባክዎ የሚከተለውን ያራግፉ፦</translation>
-<translation id="4615174829807303908">በ<ph name="SIGNOUT_MANAGED_DOMAIN" /> ከሚተዳደር መለያ ዘግተው እየወጡ ነው። ይሄ የChrome ውሂብዎን ከዚህ መሣሪያ ይሰርዘዋል፣ ነገር ግን ውሂብዎ አሁንም በእርስዎ የGoogle መለያ ውስጥ እንዳለ ይቆያል።</translation>
 <translation id="5389212809648216794">ሌላ መተግበሪያ ካሜራዎን እየተጠቀመበት ስለሆነ Google Chrome ካሜራዎን መጠቀም አይችልም</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />የተዘመነውን የ Chrome አገልግሎት ውሎች ይገምግሙ።<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">ቅንብሮች &gt; ግላዊነት &gt; ካሜራ &gt; Google Chromeን ይክፈቱና ካሜራውን ያብሩ።</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome ፈቀዳ ያለው የይለፍ ቃላትዎ መዳረሻ ለማረጋገጥ የመልክ መታወቂያን ይጠቀማል።</translation>
 <translation id="7265369419224458312">በኮምፒውተርዎ ላይ የከፈቷቸውን ትሮች እዚሁ ይድረሱባቸው። በቀላሉ Chromeን በኮምፒውተርዎ ላይ ይክፈቱ፣ ወደ ምናሌ ይሂዱ፣ እና «ወደ Chrome ግባ...»ን ይምረጡ</translation>
 <translation id="7400722733683201933">ስለ Google Chrome</translation>
-<translation id="7437998757836447326">ዘግተው ከChrome ይውጡ</translation>
 <translation id="756809126120519699">የChrome ውሂብ ጸድቷል</translation>
 <translation id="7626032353295482388">ወደ Chrome እንኳን ደህና መጡ</translation>
 <translation id="7698568245838009292">Chrome ካሜራውን መድረስ ይፈልጋል</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb
index 69a90cf..d701e05 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">‏احصل على تجربة أفضل لاستخدام Google في Chrome استنادًا إلى موقعك.</translation>
 <translation id="424864128008805179">‏هل تريد تسجيل الخروج من Chrome؟</translation>
 <translation id="4523886039239821078">‏تتسبب بعض الإضافات في تعطل Chrome. يُرجى إزالتها:</translation>
-<translation id="4615174829807303908">‏يتم تسجيل خروجك من حساب تتم إدارته من خلال <ph name="SIGNOUT_MANAGED_DOMAIN" />. سيؤدي ذلك إلى حذف بيانات Chrome من هذا الجهاز، ولكن ستظل البيانات في حسابك في Google.</translation>
 <translation id="5389212809648216794">‏يتعذر على Google Chrome استخدام الكاميرا نظرًا لأنها قيد الاستخدام من قِبل تطبيق آخر</translation>
 <translation id="5621912349729388018">‏<ph name="BEGIN_LINK" />يُرجى مراجعة بنود خدمة Chrome المعدَّلة.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">‏افتح الإعدادات &gt; الخصوصية &gt; الكاميرا &gt; Google Chrome وشغِّل الكاميرا.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">‏يستخدم Chrome تقنية "التعرُّف على الوجه" لضمان الدخول المصرَّح به إلى كلمات المرور.</translation>
 <translation id="7265369419224458312">‏يمكنك الدخول إلى علامات التبويب التي فتحتها على جهاز الكمبيوتر، مباشرةً من هنا. لن يلزمك سوى فتح Chrome على جهاز الكمبيوتر، والانتقال إلى القائمة وتحديد "تسجيل الدخول إلى Chrome…"</translation>
 <translation id="7400722733683201933">‏معلومات عن Google Chrome</translation>
-<translation id="7437998757836447326">‏تسجيل الخروج من Chrome</translation>
 <translation id="756809126120519699">‏بيانات Chrome التي تم محوها</translation>
 <translation id="7626032353295482388">‏مرحبًا بك في Chrome‏</translation>
 <translation id="7698568245838009292">‏متصفِّح Chrome يريد الوصول إلى الكاميرا</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_bg.xtb
index 0b040d67..44fbd69 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_bg.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_bg.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Подобрете практическата си работа с Google в Chrome въз основа на местоположението ви.</translation>
 <translation id="424864128008805179">Искате ли да излезете от Chrome?</translation>
 <translation id="4523886039239821078">Някои добавки водят до срив на Chrome. Моля, деинсталирайте:</translation>
-<translation id="4615174829807303908">Излизате от профил, управляван от <ph name="SIGNOUT_MANAGED_DOMAIN" />. Данните ви в Chrome ще се изтрият от това устройство, но ще останат в профила ви в Google.</translation>
 <translation id="5389212809648216794">Google Chrome не може да използва камерата ви, защото е заета от друго приложение</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Прегледайте актуализираните Общи условия на Chrome.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Отворете „Settings“ &gt; „Privacy“ &gt; „Camera“ &gt; „Google Chrome“ и включете камерата.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome използва Face ID, за да обезпечи упълномощен достъп до паролите ви.</translation>
 <translation id="7265369419224458312">Осъществявайте оттук достъп до разделите, които сте отворили на компютъра си. Трябва само да стартирате Chrome на компютъра си и да изберете „Вход в Chrome…“ от менюто.</translation>
 <translation id="7400722733683201933">Всичко за Google Chrome</translation>
-<translation id="7437998757836447326">Изход от Chrome</translation>
 <translation id="756809126120519699">Данните в Chrome са изчистени</translation>
 <translation id="7626032353295482388">Добре дошли в Chrome</translation>
 <translation id="7698568245838009292">Chrome иска достъп до камерата</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_bn.xtb
index 02572478..73b91ce 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_bn.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_bn.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">আপনার অবস্থানের উপর ভিত্তি করে Chrome এ আরও ভাল Google অভিজ্ঞতা পান।</translation>
 <translation id="424864128008805179">Chrome থেকে সাইন-আউট করবেন?</translation>
 <translation id="4523886039239821078">কিছু অ্যাড-অনের কারণে Chrome ক্র্যাশ করতে পারে৷ দয়া করে আনইনস্টল করুন:</translation>
-<translation id="4615174829807303908"><ph name="SIGNOUT_MANAGED_DOMAIN" /> দ্বারা ম্যানেজ করা একটি অ্যাকাউন্ট থেকে আপনি সাইন-আউট করছেন৷ এটি এই ডিভাইস থেকে আপনার Chrome ডেটা মুছে ফেলবে, কিন্তু আপনার Google অ্যাকাউন্টে ডেটা থেকে যাবে৷</translation>
 <translation id="5389212809648216794">Google Chrome আপনার ক্যামেরা ব্যবহার করতে পারছে না কারণ এটি অন্য একটি অ্যাপ্লিকেশান দ্বারা ব্যবহার করা হচ্ছে</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />আপডেট করা Chrome-এর পরিষেবার শর্তাবলী পর্যালোচনা করুন।<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">সেটিংস &gt; গোপনীয়তা &gt; ক্যামেরা &gt; Google Chrome খুলুন এবং ক্যামেরা চালু করুন।</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome আপনার পাসওয়ার্ডে অনুমোদিত অ্যাক্সেস নিশ্চিত করতে Face ID ব্যবহার করে।</translation>
 <translation id="7265369419224458312">সরাসরি এখান থেকে, আপনি আপনার কম্পিউটারে যে সব ট্যাব খোলা আছে সেগুলি অ্যাক্সেস করুন। শুধুমাত্র আপনার কম্পিউটারে Chrome খুলুন, মেনুতে যান এবং "Chrome-এ সাইন-ইন..." বেছে নিন।</translation>
 <translation id="7400722733683201933">Google Chrome সম্বন্ধে</translation>
-<translation id="7437998757836447326">Chrome থেকে সাইন-আউট করুন</translation>
 <translation id="756809126120519699">Chrome ডেটা সাফ হয়েছে</translation>
 <translation id="7626032353295482388">Chrome এ স্বাগতম</translation>
 <translation id="7698568245838009292">Chrome ক্যামেরা অ্যাক্সেস করতে চাইবে</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ca.xtb
index 67934dc..e44f298 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ca.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ca.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Si compartiu la ubicació, millorareu la vostra experiència a Chrome.</translation>
 <translation id="424864128008805179">Vols tancar la sessió de Chrome?</translation>
 <translation id="4523886039239821078">Alguns complements fan que Chrome es bloquegi. Desinstal·leu-los.</translation>
-<translation id="4615174829807303908">Esteu tancant la sessió d'un compte gestionat per <ph name="SIGNOUT_MANAGED_DOMAIN" />. Se suprimiran les vostres dades de Chrome d'aquest dispositiu, però continuaran al vostre compte de Google.</translation>
 <translation id="5389212809648216794">Google Chrome no pot utilitzar la càmera perquè l'està utilitzant una altra aplicació</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Revisa les condicions del servei actualitzades de Chrome.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Obre Configuració &gt; Privacitat &gt; Càmera &gt; Google Chrome i activa la càmera.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome utilitza Face ID per garantir l'accés autoritzat a les contrasenyes.</translation>
 <translation id="7265369419224458312">Accediu a les pestanyes que teniu obertes a l'ordinador des d'aquí mateix. Per fer-ho, obriu Chrome a l'ordinador, aneu al menú i seleccioneu Inici de sessió a Chrome.</translation>
 <translation id="7400722733683201933">Sobre Google Chrome</translation>
-<translation id="7437998757836447326">Tanca la sessió de Chrome</translation>
 <translation id="756809126120519699">S'han esborrat les dades de Chrome</translation>
 <translation id="7626032353295482388">Et donem la benvinguda a Chrome</translation>
 <translation id="7698568245838009292">Chrome sol·licita accés a la càmera</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_cs.xtb
index 5bdfd71..83d4217 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_cs.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Služby Google mohou v prohlížeči Chrome díky údajům o poloze fungovat lépe.</translation>
 <translation id="424864128008805179">Odhlásit se z Chromu?</translation>
 <translation id="4523886039239821078">Některé doplňky způsobují selhání prohlížeče Chrome. Prosím odinstalujte:</translation>
-<translation id="4615174829807303908">Odhlašujete se z účtu, který je spravován doménou <ph name="SIGNOUT_MANAGED_DOMAIN" />. Touto akcí smažete svá data prohlížeče Chrome z tohoto zařízení, ve vašem účtu Google však vaše data zůstanou.</translation>
 <translation id="5389212809648216794">Google Chrome nemůže použít fotoaparát, protože jej právě používá jiná aplikace</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Přečtěte si aktualizované smluvní podmínky prohlížeče Chrome.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Otevřete Nastavení &gt; Soukromí &gt; Fotoaparát &gt; Google Chrome a zapněte fotoaparát.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome pomocí funkce Face ID ověřuje přístup k heslům.</translation>
 <translation id="7265369419224458312">Karty, které máte otevřené v počítači, můžete používat přímo tady. Stačí v počítači otevřít Chrome, přejít do nabídky a vybrat možnost Přihlásit se do prohlížeče Chrome…</translation>
 <translation id="7400722733683201933">O aplikaci Google Chrome</translation>
-<translation id="7437998757836447326">Odhlášení z Chromu</translation>
 <translation id="756809126120519699">Vymazání údajů Chromu</translation>
 <translation id="7626032353295482388">Vítá vás Chrome</translation>
 <translation id="7698568245838009292">Chrome potřebuje přístup k fotoaparátu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_da.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_da.xtb
index 29de61b..960da0a 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_da.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Få en bedre Google-oplevelse i Chrome baseret på din placering.</translation>
 <translation id="424864128008805179">Vil du logge ud af Chrome?</translation>
 <translation id="4523886039239821078">Nogle tilføjelser får Chrome til at gå ned. Prøv at afinstallere:</translation>
-<translation id="4615174829807303908">Du er ved at logge ud af en konto, der administreres af <ph name="SIGNOUT_MANAGED_DOMAIN" />. Denne handling sletter dine Chrome-data fra denne enhed, men dine data forbliver på din Google-konto.</translation>
 <translation id="5389212809648216794">Google Chrome kan ikke bruge dit kamera, da det bruges af en anden app</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Se de opdaterede servicevilkår for Chrome.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Åbn Indstillinger &gt; Privatliv &gt; Kamera &gt; Google Chrome, og slå kameraet til.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome bruger Face ID til at sikre autoriseret adgang til dine adgangskoder.</translation>
 <translation id="7265369419224458312">Få adgang til de faner, der er åbne på din computer, lige her. Du åbner blot Chrome på din computer, går til menuen og vælger "Log ind i Chrome…"</translation>
 <translation id="7400722733683201933">Om Google Chrome</translation>
-<translation id="7437998757836447326">Log ud af Chrome</translation>
 <translation id="756809126120519699">Chrome-dataene blev ryddet</translation>
 <translation id="7626032353295482388">Velkommen til Chrome</translation>
 <translation id="7698568245838009292">Chrome anmoder om adgang til kameraet</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_de.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_de.xtb
index 3ec53a6..a054bc3 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_de.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Profitieren Sie von einer verbesserten Google-Nutzererfahrung in Chrome auf der Grundlage Ihres Standorts.</translation>
 <translation id="424864128008805179">Von Chrome abmelden?</translation>
 <translation id="4523886039239821078">Einige Add-ons führen zum Ausfall von Chrome. Bitte deinstallieren Sie:</translation>
-<translation id="4615174829807303908">Sie melden sich von einem Konto ab, das von <ph name="SIGNOUT_MANAGED_DOMAIN" /> verwaltet wird. Dadurch werden Ihre Chrome-Daten von diesem Gerät gelöscht, bleiben jedoch in Ihrem Google-Konto erhalten.</translation>
 <translation id="5389212809648216794">Google Chrome kann nicht auf die Kamera zugreifen, da diese gerade von einer anderen App verwendet wird</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Lesen Sie sich die aktualisierten Nutzungsbedingungen von Chrome durch.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Öffnen Sie "Einstellungen" &gt; "Datenschutz" &gt; "Kamera" &gt; "Google Chrome" und aktivieren Sie die Kamera.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome verwendet Face ID, um den autorisierten Zugriff auf Ihre Passwörter zu gewährleisten.</translation>
 <translation id="7265369419224458312">Greifen Sie hier auf die Tabs zu, die Sie auf Ihrem Computer geöffnet haben. Öffnen Sie dazu Chrome auf Ihrem Computer und wählen Sie im Menü "In Chrome anmelden…" aus.</translation>
 <translation id="7400722733683201933">Über Google Chrome</translation>
-<translation id="7437998757836447326">Von Chrome abmelden</translation>
 <translation id="756809126120519699">Gelöschte Chrome-Daten</translation>
 <translation id="7626032353295482388">Willkommen bei Chrome</translation>
 <translation id="7698568245838009292">Chrome möchte auf Ihre Kamera zugreifen</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_el.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_el.xtb
index 039c6cd87..ebf13bc 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_el.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_el.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Απολαύστε μια καλύτερη εμπειρία Google στο Chrome βάσει της τοποθεσίας σας.</translation>
 <translation id="424864128008805179">Αποσύνδεση από το Chrome;</translation>
 <translation id="4523886039239821078">Ορισμένα πρόσθετα προκαλούν σφάλματα στο Chrome. Aπεγκαταστήστε τα.</translation>
-<translation id="4615174829807303908">Πρόκειται να αποσυνδεθείτε από έναν λογαριασμό του οποίου η διαχείριση γίνεται από <ph name="SIGNOUT_MANAGED_DOMAIN" />. Αυτό θα διαγράψει τα δεδομένα σας Chrome από αυτήν τη συσκευή, αλλά θα διατηρηθούν στο Λογαριασμό σας Google.</translation>
 <translation id="5389212809648216794">Το Google Chrome δεν μπορεί να χρησιμοποιήσει την κάμερά σας επειδή χρησιμοποιείται από άλλη εφαρμογή.</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Ελέγξτε τους ενημερωμένους Όρους Παροχής Υπηρεσιών του Chrome.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Ανοίξτε το μενού Ρυθμίσεις &gt; Απόρρητο &gt; Κάμερα &gt; Google Chrome και ενεργοποιήστε την κάμερα.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Το Chrome χρησιμοποιεί το Face ID, για να διασφαλίσει την εξουσιοδοτημένη πρόσβαση στους κωδικούς πρόσβασής σας.</translation>
 <translation id="7265369419224458312">Αποκτήστε πρόσβαση στις καρτέλες που έχετε ανοίξει στον υπολογιστή σας, από εδώ. Ανοίξτε απλώς το Chrome στον υπολογιστή σας, μεταβείτε στο μενού και επιλέξτε "Σύνδεση στο Chrome…"</translation>
 <translation id="7400722733683201933">Πληροφορίες για το Google Chrome</translation>
-<translation id="7437998757836447326">Αποσύνδεση από το Chrome</translation>
 <translation id="756809126120519699">Τα δεδομένα του Chrome διαγράφηκαν</translation>
 <translation id="7626032353295482388">Καλώς ήρθατε στο Chrome</translation>
 <translation id="7698568245838009292">Το Chrome θέλει πρόσβαση στην κάμερα</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_en-GB.xtb
index 873ab16..41d6d9d 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_en-GB.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Get a better Google experience in Chrome based on your location.</translation>
 <translation id="424864128008805179">Sign out of Chrome?</translation>
 <translation id="4523886039239821078">Some add-ons cause Chrome to crash. Please uninstall:</translation>
-<translation id="4615174829807303908">You are signing out of an account managed by <ph name="SIGNOUT_MANAGED_DOMAIN" />. This will delete your Chrome data from this device, but your data will remain in your Google Account.</translation>
 <translation id="5389212809648216794">Google Chrome can't use your camera because it's in use by another application</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Review the updated Chrome Terms of Service.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Open Settings &gt; Privacy &gt; Camera &gt; Google Chrome and turn on the camera.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome uses Face ID to ensure authorised access to your passwords.</translation>
 <translation id="7265369419224458312">Access the tabs that you have open on your computer, right here. Just open Chrome on your computer, go to the menu, and select “Sign in to Chrome…”</translation>
 <translation id="7400722733683201933">About Google Chrome</translation>
-<translation id="7437998757836447326">Sign out of Chrome</translation>
 <translation id="756809126120519699">Cleared Chrome data</translation>
 <translation id="7626032353295482388">Welcome to Chrome</translation>
 <translation id="7698568245838009292">Chrome would like to access the camera</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_es-419.xtb
index 481d0c5..5395e21 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_es-419.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_es-419.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Obtén una mejor experiencia de Google en Chrome según tu ubicación.</translation>
 <translation id="424864128008805179">¿Quieres salir de Chrome?</translation>
 <translation id="4523886039239821078">Algunos complementos causan bloqueos en Chrome. Desinstala:</translation>
-<translation id="4615174829807303908">Estás saliendo de una cuenta administrada por <ph name="SIGNOUT_MANAGED_DOMAIN" />. Esta acción borrará tus datos de Chrome en este dispositivo, pero permanecerán en tu cuenta de Google.</translation>
 <translation id="5389212809648216794">Google Chrome no puede utilizar tu cámara porque la está usando otra aplicación</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Revisa las Condiciones del Servicio de Chrome actualizadas.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Abre Configuración &gt; Privacidad &gt; Cámara &gt; Google Chrome y activa la cámara.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome usa Face ID para garantizar el acceso autorizado a tus contraseñas.</translation>
 <translation id="7265369419224458312">Accede aquí a las pestañas que abriste en la computadora. Abre Chrome en la computadora, accede al menú y selecciona "Acceder a Chrome…".</translation>
 <translation id="7400722733683201933">Acerca de Google Chrome</translation>
-<translation id="7437998757836447326">Salir de Chrome</translation>
 <translation id="756809126120519699">Datos de Chrome borrados</translation>
 <translation id="7626032353295482388">Te damos la bienvenida a Chrome</translation>
 <translation id="7698568245838009292">Chrome quiere acceder a la cámara</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb
index 2168fb02..90c874e 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Disfruta de una mejor experiencia en Chrome compartiendo tu ubicación.</translation>
 <translation id="424864128008805179">¿Quieres cerrar sesión en Chrome?</translation>
 <translation id="4523886039239821078">Algunos complementos hacen que Chrome falle. Desinstálalos.</translation>
-<translation id="4615174829807303908">Estás cerrando sesión en una cuenta gestionada por <ph name="SIGNOUT_MANAGED_DOMAIN" />. Se van a eliminar tus datos de Chrome de este dispositivo, pero van a permanecer en tu cuenta de Google.</translation>
 <translation id="5389212809648216794">Google Chrome no puede utilizar la cámara porque la está usando otra aplicación</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Consulta los Términos del Servicio de Chrome actualizados<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Abre Ajustes &gt; Privacidad &gt; Cámara &gt; Google Chrome y activa la cámara.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome usa Face ID para garantizar el acceso autorizado a tus contraseñas.</translation>
 <translation id="7265369419224458312">Accede a las pestañas que tengas abiertas en tu ordenador desde aquí. Solo tienes que abrir Chrome en tu ordenador, ir al menú y seleccionar Iniciar sesión en Chrome…</translation>
 <translation id="7400722733683201933">Información de Google Chrome</translation>
-<translation id="7437998757836447326">Cerrar sesión en Chrome</translation>
 <translation id="756809126120519699">Datos de Chrome borrados</translation>
 <translation id="7626032353295482388">Te damos la bienvenida a Chrome</translation>
 <translation id="7698568245838009292">Chrome quiere acceder a la cámara</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_et.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_et.xtb
index 728fc64..8a9b372 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_et.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Asukohapõhised andmed tagavad teile parema Google Chrome'i kasutuskogemuse.</translation>
 <translation id="424864128008805179">Kas logida Chrome'ist välja?</translation>
 <translation id="4523886039239821078">Mõned pistikprogrammid põhjustavad Chrome'i kokkujooksmise. Desinstallige need:</translation>
-<translation id="4615174829807303908">Logite välja kontolt, mida haldab <ph name="SIGNOUT_MANAGED_DOMAIN" />. Selle tulemusel kustutatakse seadmes olevad Chrome'i andmed, kuid need jäävad alles teie Google'i kontole.</translation>
 <translation id="5389212809648216794">Google Chrome ei saa kaamerat kasutada, kuna seda kasutab muu rakendus</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Vaadake üle Chrome'i värskendatud teenusetingimused.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Tehke valikud Seaded &gt; Privaatsus &gt; Kaamera &gt; Google Chrome ja lülitage kaamera sisse.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome kasutab paroolide volitatud juurdepääsu kontrollimiseks Face ID-d.</translation>
 <translation id="7265369419224458312">Hankige juurdepääs arvutis avatud vahelehtedele siit. Lihtsalt avage arvutis Chrome, minge menüüsse ja valige käsk „Logi Chrome'i sisse ...”</translation>
 <translation id="7400722733683201933">Google Chrome'i kohta</translation>
-<translation id="7437998757836447326">Chrome'ist väljalogimine</translation>
 <translation id="756809126120519699">Chrome'i andmed kustutati</translation>
 <translation id="7626032353295482388">Tere tulemast Chrome'i</translation>
 <translation id="7698568245838009292">Chrome soovib juurdepääsu kaamerale</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fa.xtb
index 1836e71..f0025675 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fa.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">‏با Chrome تجربه بهتری از Google براساس موقعیت مکانی‌تان داشته باشید.</translation>
 <translation id="424864128008805179">‏از سیستم Chrome خارج می شوید؟</translation>
 <translation id="4523886039239821078">‏برخی از افزونه‌ها باعث می‌شوند Chrome از کار بیفتد. لطفاً آنها را حذف نصب کنید:</translation>
-<translation id="4615174829807303908">‏هم‌اکنون از حسابی که توسط <ph name="SIGNOUT_MANAGED_DOMAIN" /> مدیریت می‌شود، خارج می‌شوید. با این کار داده‌های Chrome شما از این دستگاه حذف می‌شود اما همچنان در حساب Google شما باقی می‌ماند.</translation>
 <translation id="5389212809648216794">‏Google Chrome نمی‌تواند از دوربین استفاده کند زیرا برنامه دیگری از آن استفاده می‌کند</translation>
 <translation id="5621912349729388018">‏<ph name="BEGIN_LINK" />شرایط خدمات به‌روزشده Chrome را مرور کنید.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">‏Settings (تنظیمات) &gt; Privacy (حریم خصوصی) &gt; Camera (دوربین) &gt; Google Chrome را باز کنید و دوربین را روشن کنید.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">‏Chrome برای اطمینان از دسترسی مجاز به گذرواژه‌هایتان از «شناسه تشخیص چهره» استفاده می‌کند.</translation>
 <translation id="7265369419224458312">‏از اینجا به برگه‌هایی که دررایانه‌تان باز کرده‌اید دسترسی داشته باشید. کافیست Chrome را در رایانه‌تان باز کنید، به منو بروید و «ورود به سیستم Chrome» را انتخاب کنید.</translation>
 <translation id="7400722733683201933">‏درباره Google Chrome</translation>
-<translation id="7437998757836447326">‏خروج از سیستم Chrome</translation>
 <translation id="756809126120519699">‏داده‌های Chrome پاک شد</translation>
 <translation id="7626032353295482388">‏به Chrome خوش آمدید</translation>
 <translation id="7698568245838009292">‏Chrome می‌خواهد به «دوربین» دسترسی داشته باشد</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fi.xtb
index abe7afd..294dfb01 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fi.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fi.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Saat paremman Googlen käyttökokemuksen Chromessa sijaintisi perusteella.</translation>
 <translation id="424864128008805179">Kirjaudutaanko ulos Chromesta?</translation>
 <translation id="4523886039239821078">Jokin laajennus kaataa Chromen. Kokeile poistaa seuraavat:</translation>
-<translation id="4615174829807303908">Olet kirjautumassa ulos verkkotunnuksen <ph name="SIGNOUT_MANAGED_DOMAIN" /> hallinnoimalta tililtä. Chrome-tietosi poistetaan tältä laitteelta, mutta tietosi säilyvät Google-tililläsi.</translation>
 <translation id="5389212809648216794">Google Chrome ei voi käyttää kameraa, koska se on toisen sovelluksen käytössä.</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Lue Chromen päivitetyt käyttöehdot.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Avaa Asetukset &gt; Tietosuoja &gt; Kamera &gt; Google Chrome ja ota kamera käyttöön.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome varmistaa Face ID:llä, että sinulla on lupa käyttää salasanoja.</translation>
 <translation id="7265369419224458312">Voit käyttää tietokoneella avoinna olevia välilehtiä myös täällä. Avaa Chrome tietokoneella, siirry valikkoon ja valitse Kirjaudu Chromeen…</translation>
 <translation id="7400722733683201933">Tietoja Google Chromesta</translation>
-<translation id="7437998757836447326">Uloskirjautuminen Chromesta</translation>
 <translation id="756809126120519699">Chrome-tiedot tyhjennetty</translation>
 <translation id="7626032353295482388">Tervetuloa Chromeen</translation>
 <translation id="7698568245838009292">Chrome pyytää kameran käyttöoikeutta</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb
index 71faf2a..7c70169 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Magkaroon ng mas mahusay na karanasan sa Google sa Chrome batay sa iyong lokasyon.</translation>
 <translation id="424864128008805179">Mag-sign out sa Chrome?</translation>
 <translation id="4523886039239821078">Nagiging dahilan ang ilang add-on ng pag-crash ng Chrome. Paki-uninstall.</translation>
-<translation id="4615174829807303908">Nagsa-sign out ka sa account na pinamamahalaan ng <ph name="SIGNOUT_MANAGED_DOMAIN" />. Ide-delete nito ang data mo sa Chrome sa device na ito, ngunit mananatili ang data mo sa iyong Google account.</translation>
 <translation id="5389212809648216794">Hindi magamit ng Google Chrome ang iyong camera ngayon dahil ginagamit ito sa isa pang application</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Suriin ang na-update na Mga Tuntunin ng Serbisyo ng Chrome.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Buksan ang Settings &gt; Privacy &gt; Camera &gt; Google Chrome at i-on ang camera.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Gumagamit ang Chrome ng Face ID para tiyakin ang awtorisadong pag-access sa iyong mga password.</translation>
 <translation id="7265369419224458312">I-access ang mga tab na nakabukas sa iyong computer, dito mismo. Buksan lang ang Chrome sa iyong computer, pumunta sa menu, at piliin ang "Mag-sign in sa Chrome..."</translation>
 <translation id="7400722733683201933">Tungkol sa Google Chrome</translation>
-<translation id="7437998757836447326">Mag-sign out sa Chrome</translation>
 <translation id="756809126120519699">Na-clear ang data ng Chrome</translation>
 <translation id="7626032353295482388">Welcome sa Chrome</translation>
 <translation id="7698568245838009292">Gustong I-access ng Chrome ang Camera</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fr.xtb
index 8331dcd..36704de 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fr.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Améliorez votre expérience Google dans Chrome grâce à votre position.</translation>
 <translation id="424864128008805179">Se déconnecter de Chrome ?</translation>
 <translation id="4523886039239821078">Certains modules complémentaires entraînent le plantage de Chrome. Veuillez les désinstaller.</translation>
-<translation id="4615174829807303908">Vous vous déconnectez d'un compte géré par <ph name="SIGNOUT_MANAGED_DOMAIN" />. Cette opération entraînera la suppression de vos données Chrome de cet appareil, mais celles-ci seront conservées dans votre compte Google.</translation>
 <translation id="5389212809648216794">Google Chrome ne peut pas utiliser l'appareil photo, car celui-ci est utilisé par une autre application</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Passez en revue les Conditions d'utilisation de Chrome mises à jour.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Ouvrez Paramètres &gt; Confidentialité &gt; Appareil photo &gt; Google Chrome, puis activez l'appareil photo.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome utilise Face ID pour autoriser l'accès à vos mots de passe.</translation>
 <translation id="7265369419224458312">Accédez ici aux onglets ouverts sur votre ordinateur. Il vous suffit d'ouvrir Chrome sur votre ordinateur, d'accéder au menu, puis de sélectionner "Se connecter à Chrome".</translation>
 <translation id="7400722733683201933">À propos de Google Chrome</translation>
-<translation id="7437998757836447326">Se déconnecter de Chrome</translation>
 <translation id="756809126120519699">Données de Chrome effacées</translation>
 <translation id="7626032353295482388">Bienvenue dans Chrome</translation>
 <translation id="7698568245838009292">Chrome souhaite accéder à l'appareil photo</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_gu.xtb
index 30871e4..0fe466d 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_gu.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_gu.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Chrome માં તમારા સ્થાન પર આધારિત બહેતર Google અનુભવ મેળવો.</translation>
 <translation id="424864128008805179">Chromeમાંથી સાઇન આઉટ કરીએ?</translation>
 <translation id="4523886039239821078">કેટલાંક એડ-ઓનને કારણે Chrome ક્રૅશ થાય છે. કૃપા કરી આને અનઇન્સ્ટૉલ કરો:</translation>
-<translation id="4615174829807303908">તમે <ph name="SIGNOUT_MANAGED_DOMAIN" /> દ્વારા મેનેજ એકાઉન્ટમાંથી સાઇન આઉટ કરી રહ્યાં છો. આ તમારા Chrome ડેટાને આ ડિવાઇસમાંથી ડિલીટ કરશે, પરંતુ તમારો ડેટા તમારા Google એકાઉન્ટમાં રહેશે.</translation>
 <translation id="5389212809648216794">Google Chrome, તમારા કૅમેરાનો ઉપયોગ કરી શકતું નથી કારણ કે તે બીજી ઍપ્લિકેશન દ્વારા ઉપયોગમાં છે</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Chromeની અપડેટ કરેલી સેવાની શરતોનો રિવ્યૂ કરો.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">સેટિંગ્સ &gt; ગોપનીયતા &gt; કૅમેરો &gt; Google Chrome ખોલો અને કૅમેરો ચાલુ કરો.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">તમારા પાસવર્ડની અધિકૃત ઍક્સેસની ખાતરી કરવા માટે, Chrome ચહેરાના IDનો ઉપયોગ કરે છે.</translation>
 <translation id="7265369419224458312">તમે તમારા કમ્પ્યુટર પર ખોલેલા ટેબ્સને અહીંથી જ ઍક્સેસ કરો. બસ તમારા કમ્પ્યુટર પર Chrome ખોલો, મેનૂ પર જાઓ અને "Chrome પર સાઇન ઇન કરો..." ને પસંદ કરો</translation>
 <translation id="7400722733683201933">Google Chrome વિશે</translation>
-<translation id="7437998757836447326">Chromeમાંથી સાઇન આઉટ કરો</translation>
 <translation id="756809126120519699">Chrome ડેટા સાફ કર્યો</translation>
 <translation id="7626032353295482388">Chrome પર આપનું સ્વાગત છે</translation>
 <translation id="7698568245838009292">Chromeને કૅમેરાનો ઍક્સેસ જોઈશે</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb
index 51edefd4..d008b59 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">अपने स्थान के आधार पर Chrome में एक बेहतर Google अनुभव पाएं.</translation>
 <translation id="424864128008805179">Chrome से साइन आउट करें?</translation>
 <translation id="4523886039239821078">कुछ ऐड-ऑन के कारण Chrome बंद हो जा रहा है. कृपया उन्हें अनइंस्टॉल करें:</translation>
-<translation id="4615174829807303908">आप <ph name="SIGNOUT_MANAGED_DOMAIN" /> से प्रबंधित खाते से साइन आउट कर रहे हैं. इससे आपका Chrome डेटा इस डिवाइस से मिट जाएगा, लेकिन आपका डेटा आपके Google खाते में बना रहेगा.</translation>
 <translation id="5389212809648216794">Google Chrome आपके कैमरे का उपयोग नहीं कर सकता क्योंकि दूसरा ऐप्लिकेशन उसका उपयोग कर रहा है</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Chrome की अपडेट की गई सेवा की शर्तें देखें.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">सेटिंग &gt; निजता &gt; कैमरा &gt; Google Chrome खोलें और कैमरा चालू करें.</translation>
@@ -44,7 +43,6 @@
 <translation id="7173660919484573146">आपके पासवर्ड का अधिकृत ऐक्सेस पक्का करने के लिए, Chrome 'फ़ेस आईडी' यानी चेहरा पहचान का इस्तेमाल करता है.</translation>
 <translation id="7265369419224458312">अपने कंप्यूटर पर खोले गए टैब सीधे यहां से एक्सेस करें. बस अपने कंप्यूटर पर Chrome खोलें, मेन्यू पर जाएं और “Chrome में साइन इन करें…” चुनें</translation>
 <translation id="7400722733683201933">Google Chrome के बारे में</translation>
-<translation id="7437998757836447326">Chrome से साइन आउट करें</translation>
 <translation id="756809126120519699">साफ़ किया गया Chrome डेटा</translation>
 <translation id="7626032353295482388">Chrome में आपका स्वागत है</translation>
 <translation id="7698568245838009292">Chrome आपका कैमरा ऐक्सेस करना चाहता है</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hr.xtb
index 3a25acf8..6abae47 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hr.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Doživite Google na bolji način u Chromeu na temelju svoje lokacije.</translation>
 <translation id="424864128008805179">Želite li se odjaviti s Chromea?</translation>
 <translation id="4523886039239821078">Neki programski dodaci uzrokuju rušenje preglednika Chrome. Deinstalirajte:</translation>
-<translation id="4615174829807303908">Odjavljujete se s računa kojim upravlja <ph name="SIGNOUT_MANAGED_DOMAIN" />. Vaši podaci na Chromeu izbrisat će se s ovog uređaja, no ostat će na vašem Google računu.</translation>
 <translation id="5389212809648216794">Google Chrome ne može upotrebljavati vaš fotoaparat jer ga upotrebljava neka druga aplikacija</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Pregledajte ažurirane Chromove uvjete pružanja usluge.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Otvorite Postavke &gt; Privatnost &gt; Fotoaparat &gt; Google Chrome i uključite fotoaparat.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome upotrebljava Face ID radi sprječavanja neovlaštenog pristupa vašim zaporkama.</translation>
 <translation id="7265369419224458312">Karticama koje ste otvorili na računalu možete pristupiti i ovdje. Samo otvorite Chrome na računalu, idite na izbornik i odaberite "Prijava na Chrome…"</translation>
 <translation id="7400722733683201933">O programu Google Chrome</translation>
-<translation id="7437998757836447326">Odjava s Chromea</translation>
 <translation id="756809126120519699">Chromeovi su podaci izbrisani</translation>
 <translation id="7626032353295482388">Dobro došli u Chrome</translation>
 <translation id="7698568245838009292">Chrome želi pristupiti kameri</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hu.xtb
index 77556db..9301763 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hu.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hu.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Jobb Google-felhasználói élmény a Chrome-ban a tartózkodási hely alapján.</translation>
 <translation id="424864128008805179">Kijelentkezés a Chrome-ból</translation>
 <translation id="4523886039239821078">Bizonyos bővítmények a Chrome összeomlását eredményezik. Távolítsa el a következő(ke)t:</translation>
-<translation id="4615174829807303908">Kijelentkezik egy <ph name="SIGNOUT_MANAGED_DOMAIN" /> által felügyelt fiókból. Ezzel törli az eszközön található Chrome-adatokat, amelyek azonban Google-fiókjában megmaradnak.</translation>
 <translation id="5389212809648216794">A Google Chrome nem tudja használni a kamerát, mivel egy másik alkalmazás használja</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />A Chrome frissített Általános Szerződési Feltételeinek áttekintése.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Nyissa meg a Beállítások &gt; Adatvédelem &gt; Kamera &gt; Google Chrome elemet, és kapcsolja be a kamerát.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">A Chrome a Face ID segítségével ellenőrzi a jogosultságot a jelszavakhoz való hozzáféréshez.</translation>
 <translation id="7265369419224458312">Itt is hozzáférhet a számítógépen megnyitott lapokhoz. Ehhez elég elindítani a Chrome-ot számítógépén, megnyitni a menüt, majd a „Bejelentkezés a Chrome-ba…” lehetőséget választani.</translation>
 <translation id="7400722733683201933">A Google Chrome névjegye</translation>
-<translation id="7437998757836447326">Kijelentkezés a Chrome-ból</translation>
 <translation id="756809126120519699">Chrome-adatok törölve</translation>
 <translation id="7626032353295482388">A Chrome üdvözli Önt!</translation>
 <translation id="7698568245838009292">A Chrome hozzá szeretne férni a kamerához</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_id.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_id.xtb
index aadac73..23f3adf 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_id.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Dapatkan pengalaman Google yang lebih baik di Chrome berdasarkan lokasi Anda.</translation>
 <translation id="424864128008805179">Logout dari Chrome?</translation>
 <translation id="4523886039239821078">Beberapa pengaya (pengaya) menyebabkan Chrome mogok. Uninstal:</translation>
-<translation id="4615174829807303908">Anda keluar dari akun yang dikelola oleh <ph name="SIGNOUT_MANAGED_DOMAIN" />. Tindakan ini akan menghapus data Chrome dari perangkat ini, namun data ini akan tetap tersedia di Akun Google.</translation>
 <translation id="5389212809648216794">Google Chrome tidak dapat menggunakan kamera karena sedang digunakan aplikasi lain</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Tinjau Persyaratan Layanan Chrome yang diperbarui.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Buka Setelan &gt; Privasi &gt; Kamera &gt; Google Chrome, lalu aktifkan kamera.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome menggunakan Face ID untuk memastikan akses terotorisasi ke sandi Anda.</translation>
 <translation id="7265369419224458312">Akses tab yang telah Anda buka di komputer, di sini. Cukup buka Chrome di komputer, buka menu, lalu pilih "Login ke Chrome…”</translation>
 <translation id="7400722733683201933">Tentang Google Chrome</translation>
-<translation id="7437998757836447326">Logout dari Chrome</translation>
 <translation id="756809126120519699">Data Chrome telah dihapus</translation>
 <translation id="7626032353295482388">Selamat Datang di Chrome</translation>
 <translation id="7698568245838009292">Chrome Ingin Mengakses Kamera</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_it.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_it.xtb
index 29e90581..8553300 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_it.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_it.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Migliora la tua esperienza di Chrome tramite l'accesso alla tua posizione.</translation>
 <translation id="424864128008805179">Uscire da Chrome?</translation>
 <translation id="4523886039239821078">Alcuni componenti aggiuntivi provocano l'arresto anomalo di Chrome. Disinstallali.</translation>
-<translation id="4615174829807303908">Stai per uscire da un account gestito da <ph name="SIGNOUT_MANAGED_DOMAIN" />. I dati di Chrome verranno eliminati da questo dispositivo, ma rimarranno memorizzati nel tuo Account Google.</translation>
 <translation id="5389212809648216794">Google Chrome non può utilizzare la videocamera perché è attualmente utilizzata da un'altra applicazione</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Leggi i Termini di servizio di Chrome aggiornati<ph name="END_LINK" />.</translation>
 <translation id="5639704535586432836">Apri impostazioni &gt; Privacy &gt; Fotocamera &gt; Google Chrome e attiva la videocamera.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome utilizza Face ID per garantire accesso autorizzato alle tue password.</translation>
 <translation id="7265369419224458312">Accedi alle schede che hai aperto sul computer direttamente qui. Apri Chrome sul computer, apri il menu e seleziona "Accedi a Chrome…".</translation>
 <translation id="7400722733683201933">Informazioni su Google Chrome</translation>
-<translation id="7437998757836447326">Esci da Chrome</translation>
 <translation id="756809126120519699">Dati di Chrome cancellati</translation>
 <translation id="7626032353295482388">Benvenuto in Chrome</translation>
 <translation id="7698568245838009292">Chrome vorrebbe accedere alla fotocamera</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_iw.xtb
index cb04fc76..24781f0 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_iw.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">‏תוכל ליהנות מחוויית Google משופרת ב-Chrome בהתבסס על המיקום שלך.</translation>
 <translation id="424864128008805179">‏האם לצאת מ-Chrome?</translation>
 <translation id="4523886039239821078">‏תוספים מסוימים גורמים ל-Chrome לקרוס. הסר את ההתקנה שלהם:</translation>
-<translation id="4615174829807303908">‏אתה יוצא מחשבון המנוהל על-ידי <ph name="SIGNOUT_MANAGED_DOMAIN" />. פעולה זו תמחק את הנתונים שלך ב-Chrome מהמכשיר הזה, אבל הם יישארו בחשבון Google שלך.</translation>
 <translation id="5389212809648216794">‏Google Chrome לא יכול להשתמש במצלמה כי אפליקציה אחרת משתמשת בה</translation>
 <translation id="5621912349729388018">‏<ph name="BEGIN_LINK" />עיון בתנאים ובהגבלות המעודכנים של Chrome.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">‏עבור אל 'הגדרות' &gt; 'פרטיות' &gt; 'מצלמה' &gt; Google Chrome והפעל את המצלמה.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">‏Chrome משתמש ב-Face ID כדי להבטיח גישה מאושרת לסיסמאות שלך.</translation>
 <translation id="7265369419224458312">‏גש מכאן ישירות לכרטיסיות שפתחת במחשב. פתח את Chrome במחשב, עבור אל התפריט ובחר באפשרות 'היכנס אל Chrome...'</translation>
 <translation id="7400722733683201933">‏אודות Google Chrome</translation>
-<translation id="7437998757836447326">‏יציאה מ-Chrome</translation>
 <translation id="756809126120519699">‏נתוני Chrome נוקו</translation>
 <translation id="7626032353295482388">‏ברוכים הבאים ל-Chrome</translation>
 <translation id="7698568245838009292">‏ל-Chrome דרושה גישה למצלמה</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ja.xtb
index ccbb9822..d2a9e07 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ja.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ja.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">ユーザーの場所に基づいてChromeでGoogleを使いやすくします。</translation>
 <translation id="424864128008805179">Chrome からログアウトしますか?</translation>
 <translation id="4523886039239821078">アドオンが原因でChromeがクラッシュしました。次をアンインストールしてください:</translation>
-<translation id="4615174829807303908"><ph name="SIGNOUT_MANAGED_DOMAIN" /> で管理されているアカウントからログアウトします。Chrome データはこのデバイスから削除されますが、Google アカウントで保持されます。</translation>
 <translation id="5389212809648216794">カメラは別のアプリが使用中のため、Google Chrome では使用できません</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />最新の Chrome 利用規約を確認してください。<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">[設定] &gt; [プライバシー] &gt; [カメラ] &gt; [Google Chrome] の順に選択し、カメラをオンにします。</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome では Face ID の使用により、パスワードへの認証されたアクセスのみが許可されます。</translation>
 <translation id="7265369419224458312">パソコンで開いたタブにこちらからアクセスできます。パソコンでChromeを開き、メニューから[Chromeにログイン]を選択してください。</translation>
 <translation id="7400722733683201933">Google Chrome について</translation>
-<translation id="7437998757836447326">Chrome からログアウト</translation>
 <translation id="756809126120519699">Chrome データの消去完了</translation>
 <translation id="7626032353295482388">Chrome へようこそ</translation>
 <translation id="7698568245838009292">Chrome がカメラへのアクセス許可を求めています</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb
index c907cc08..29e1fc27d7 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_kn.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಆಧರಿಸಿ Chrome ನಲ್ಲಿ ಉತ್ತಮ Google ಅನುಭವವನ್ನು ಪಡೆಯಿರಿ.</translation>
 <translation id="424864128008805179">Chrome ನಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡುವುದೇ?</translation>
 <translation id="4523886039239821078">ಕೆಲವು ಆ್ಯಡ್-ಆನ್‌ಗಳು Chrome ಕ್ರ್ಯಾಶ್ ಆಗಲು ಕಾರಣವಾಗಿವೆ. ದಯವಿಟ್ಟು ಇದನ್ನು ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿ:</translation>
-<translation id="4615174829807303908"><ph name="SIGNOUT_MANAGED_DOMAIN" /> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾದ ಖಾತೆಯಿಂದ ನೀವು ಸೈನ್ ಔಟ್ ಮಾಡುತ್ತಿರುವಿರಿ. ಇದು ಈ ಸಾಧನದಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗಿರುವ Chrome ಡೇಟಾವನ್ನು ಅಳಿಸುತ್ತದೆ, ಆದರೆ ನಿಮ್ಮ ಡೇಟಾ ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿಯೇ ಇರುತ್ತದೆ.</translation>
 <translation id="5389212809648216794">ನಿಮ್ಮ ಕ್ಯಾಮರಾವನ್ನು ಬೇರೆ ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಕ ಬಳಸುತ್ತಿರುವ ಕಾರಣ Google Chrome ಗೆ ಅದನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗಿರುವ Chrome ಸೇವಾ ನಿಯಮಗಳನ್ನು ನೋಡಿ.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">ಸೆಟ್ಟಿಂಗ್‌ಗಳು &gt; ಗೌಪ್ಯತೆ &gt; ಕ್ಯಾಮರಾ &gt; Google Chrome ತೆರೆಯಿರಿ ಮತ್ತು ಕ್ಯಾಮರಾ ಆನ್ ಮಾಡಿ.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ಗಳಿಗೆ ಅಧಿಕೃತ ಪ್ರವೇಶವನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು, Chrome ಮುಖದ ಐಡಿಯನ್ನು ಬಳಸುತ್ತದೆ.</translation>
 <translation id="7265369419224458312">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ನೀವು ತೆರೆದಿರುವ ಟ್ಯಾಬ್‌ಗಳನ್ನು ಇಲ್ಲಿಯೇ ಪ್ರವೇಶಿಸಿ. ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ Chrome ತೆರೆಯಿರಿ, ಮೆನುಗೆ ಹೋಗಿ ಮತ್ತು “Chrome ಗೆ ಸೈನ್‌ ಇನ್‌ ಮಾಡು…” ಆಯ್ಕೆಮಾಡಿ</translation>
 <translation id="7400722733683201933">Google Chrome ಕುರಿತು</translation>
-<translation id="7437998757836447326">Chrome ನಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡಿ</translation>
 <translation id="756809126120519699">Chrome ಡೇಟಾ ತೆರವುಗೊಳಿಸಲಾಗಿದೆ</translation>
 <translation id="7626032353295482388">Chrome ಗೆ ಸ್ವಾಗತ</translation>
 <translation id="7698568245838009292">ಕ್ಯಾಮರಾವನ್ನು ಪ್ರವೇಶಿಸಲು Chrome ಬಯಸುತ್ತದೆ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ko.xtb
index ed56a94..7942c06 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ko.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">위치 정보를 기반으로 Chrome에서 더 나은 Google 환경을 이용할 수 있습니다.</translation>
 <translation id="424864128008805179">Chrome에서 로그아웃하시겠습니까?</translation>
 <translation id="4523886039239821078">일부 부가기능이 Chrome을 비정상 종료시킵니다. 다음 항목을 제거하세요.</translation>
-<translation id="4615174829807303908"><ph name="SIGNOUT_MANAGED_DOMAIN" />에서 관리하는 계정에서 로그아웃합니다. 이렇게 하면 내 Chrome 데이터가 이 기기에서 삭제되지만 Google 계정에는 그대로 유지됩니다.</translation>
 <translation id="5389212809648216794">다른 애플리케이션에서 카메라를 사용하고 있으므로 Chrome에서 카메라를 사용할 수 없습니다.</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />업데이트된 Chrome 서비스 약관을 검토하세요.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">설정 &gt; 개인정보 보호 &gt; 카메라 &gt; Chrome을 열고 카메라를 사용 설정하세요.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome은 얼굴 ID를 사용하여 승인된 사용자만 비밀번호에 액세스할 수 있도록 합니다.</translation>
 <translation id="7265369419224458312">여기에서 컴퓨터에서 열어 둔 탭에 바로 액세스할 수 있습니다. 컴퓨터에서 Chrome을 열고 메뉴로 이동하여 'Chrome에 로그인...'을 선택하세요.</translation>
 <translation id="7400722733683201933">Chrome 정보</translation>
-<translation id="7437998757836447326">Chrome에서 로그아웃</translation>
 <translation id="756809126120519699">Chrome 데이터 삭제됨</translation>
 <translation id="7626032353295482388">Chrome에 오신 것을 환영합니다</translation>
 <translation id="7698568245838009292">Chrome에서 카메라에 액세스하려고 함</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lt.xtb
index eb603c76..d06c1b3a 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lt.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lt.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Patogiau naudokitės „Google“ funkcijomis naudodami pagal vietovę pritaikytą „Chrome“.</translation>
 <translation id="424864128008805179">Atsijungti nuo „Chrome“?</translation>
 <translation id="4523886039239821078">Dėl tam tikrų priedų „Chrome“ užstringa . Pašalinkite:</translation>
-<translation id="4615174829807303908">Atsijungiate nuo paskyros, kurią valdo <ph name="SIGNOUT_MANAGED_DOMAIN" />. „Chrome“ duomenys bus ištrinti iš šio įrenginio, bet liks „Google“ paskyroje.</translation>
 <translation id="5389212809648216794">„Google Chrome“ negali naudoti fotoaparato, nes jį naudoja kita programa</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Peržiūrėkite atnaujintas „Chrome“ paslaugų teikimo sąlygas.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Atidarykite „Nustatymai“ &gt; „Privatumas“ &gt; „Fotoaparatas“ &gt; „Google Chrome“ ir įjunkite fotoaparatą.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">„Chrome“ naudoja „Face ID“, kad užtikrintų teisėtą prieigą prie slaptažodžių.</translation>
 <translation id="7265369419224458312">Čia galite pasiekti skirtukus, kurių lapus esate atidarę kompiuteryje. Tiesiog atidarykite „Chrome“ kompiuteryje, eikite į meniu ir pasirinkite „Prisijungti prie „Chrome“...“</translation>
 <translation id="7400722733683201933">Apie „Google Chrome“</translation>
-<translation id="7437998757836447326">Atsijungimas nuo „Chrome“</translation>
 <translation id="756809126120519699">Išvalyti „Chrome“ duomenys</translation>
 <translation id="7626032353295482388">Sveiki, tai „Chrome“</translation>
 <translation id="7698568245838009292">„Chrome“ nori pasiekti fotoaparatą</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lv.xtb
index e1497ed8..f1d4841 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lv.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Uzlabojiet savu Google pakalpojumu izmantošanas pieredzi pārlūkā Chrome, sūtot informāciju par savu atrašanās vietu.</translation>
 <translation id="424864128008805179">Vai izrakstīties no pārlūka Chrome?</translation>
 <translation id="4523886039239821078">Daži papildinājumi var izraisīt pārlūka Chrome avarēšanu. Lūdzu, atinstalējiet šos papildinājumus:</translation>
-<translation id="4615174829807303908">Jūs izrakstāties no konta, kas tiek pārvaldīts domēnā <ph name="SIGNOUT_MANAGED_DOMAIN" />. Izrakstoties Chrome dati tiks dzēsti no šīs ierīces, taču tie paliks jūsu Google kontā.</translation>
 <translation id="5389212809648216794">Google Chrome pašlaik nevar izmantot kameru, jo to izmanto cita lietojumprogramma.</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Izlasiet atjauninātos Chrome pakalpojumu sniegšanas noteikumus<ph name="END_LINK" />.</translation>
 <translation id="5639704535586432836">Atveriet sadaļu Iestatījumi &gt; Konfidencialitāte &gt; Kamera &gt; Google Chrome un ieslēdziet kameru.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome izmanto Face ID, lai jūsu parolēm varētu piekļūt tikai pilnvarotas personas.</translation>
 <translation id="7265369419224458312">Šeit varat piekļūt cilnēm, kas ir atvērtas jūsu datorā. Vienkārši atveriet pārlūku Chrome savā datorā, pārejiet uz izvēlni un atlasiet “Pierakstīties pakalpojumā Chrome…”</translation>
 <translation id="7400722733683201933">Par Google Chrome</translation>
-<translation id="7437998757836447326">Izrakstīšanās no pārlūka Chrome</translation>
 <translation id="756809126120519699">Chrome dati tika notīrīti</translation>
 <translation id="7626032353295482388">Laipni lūdzam pārlūkā Chrome</translation>
 <translation id="7698568245838009292">Chrome pieprasa piekļuvi kamerai</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb
index 62607a3..d87db97 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Chrome-ൽ നിങ്ങളുടെ ലൊക്കേഷൻ അടിസ്ഥാനമാക്കിയുള്ള ഒരു മികച്ച Google അനുഭവം നേടുക.</translation>
 <translation id="424864128008805179">Chrome-ൽ നിന്ന് സൈൻ ഔട്ട് ചെയ്യണോ?</translation>
 <translation id="4523886039239821078">ചില ആഡ്-ഓണുകൾ Chrome ക്രാഷാകുന്നതിന് ഇടയാക്കുന്നു. ഇനിപ്പറയുന്നവ അൺഇൻസ്റ്റാൾ ചെയ്യുക:</translation>
-<translation id="4615174829807303908"><ph name="SIGNOUT_MANAGED_DOMAIN" /> മാനേജ് ചെയ്യുന്ന അക്കൗണ്ടിൽ നിന്നും നിങ്ങൾ സൈൻ ഔട്ട് ചെയ്യുകയാണ്. ഇത് ഈ ഉപകരണത്തിൽ നിന്ന് നിങ്ങളുടെ Chrome വിവരങ്ങൾ ഇല്ലാതാക്കുമെങ്കിലും, Google അക്കൗണ്ടിൽ തുടർന്നും അവ ഉണ്ടായിരിക്കുന്നതാണ്.</translation>
 <translation id="5389212809648216794">മറ്റൊരു അപ്ലിക്കേഷൻ നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കുന്നതിനാൽ Google Chrome-ന് അത്‌ ഉപയോഗിക്കാനാവില്ല</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />അപ്‌ഡേറ്റ് ചെയ്‌ത Chrome സേവന നിബന്ധനകൾ അവലോകനം ചെയ്യുക.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">ക്രമീകരണം &gt; സ്വകാര്യത &gt; ക്യാമറ &gt; Google Chrome തുറന്ന് ക്യാമറ ഓണാക്കുക.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">നിങ്ങളുടെ പാസ്‌വേഡിലേക്കുള്ള അംഗീകൃത ആക്‌സസ് ഉറപ്പാക്കാന്‍ Chrome, ഫേസ് ഐഡി ഉപയോഗിക്കുന്നു.</translation>
 <translation id="7265369419224458312">നിങ്ങൾ കമ്പ്യൂട്ടറിൽ തുറന്ന ടാബുകൾ ഇവിടെ നിന്നും ആക്‌സസ് ചെയ്യുക. കമ്പ്യൂട്ടറിൽ Chrome തുറന്ന് മെനുവിലേക്ക് പോയി “Chrome-ൽ സൈൻ ഇൻ ചെയ്യുക” തിരഞ്ഞെടുക്കുക...</translation>
 <translation id="7400722733683201933">Google Chrome നെ കുറിച്ച്</translation>
-<translation id="7437998757836447326">Chrome-ൽ നിന്നും സൈൻ ഔട്ട് ചെയ്യുക</translation>
 <translation id="756809126120519699">Chrome ഡാറ്റ മായ്‌ച്ചു</translation>
 <translation id="7626032353295482388">Chrome-ലേക്ക് സ്വാഗതം</translation>
 <translation id="7698568245838009292">ക്യാമറ ആക്‌സസ് ചെയ്യാൻ Chrome ആഗ്രഹിക്കുന്നു</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_mr.xtb
index 700fe95..c1c7358 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_mr.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_mr.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">आपल्या स्थानावर आधारित Chrome मध्ये उत्कृष्ट Google अनुभव मिळवा.</translation>
 <translation id="424864128008805179">Chrome मधून साइन आउट करायचे?</translation>
 <translation id="4523886039239821078">Chrome क्रॅश होण्याचे कारण काही अॅड-ऑन आहेत. कृपया ती अनइंस्टॉल करा:</translation>
-<translation id="4615174829807303908"><ph name="SIGNOUT_MANAGED_DOMAIN" /> द्वारे व्यवस्थापित केलेल्या खात्यामधून तुम्ही साइन आउट करीत आहात. हे तुमचा Chrome डेटा या डिव्हाइस वरून हटवेल परंतु तुमचा डेटा आपल्या Google खात्यामध्ये असेल.</translation>
 <translation id="5389212809648216794">Google Chrome तुमचा कॅमेरा वापरू शकत नाही कारण दुसरे ॲप्स सध्या तो वापरत आहे.</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />अपडेट केलेल्या Chrome सेवा अटींचे पुनरावलोकन करा.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">सेटिंग्ज &gt; गोपनीयता &gt; कॅमेरा &gt; Google Chrome उघडा आणि कॅमेरा चालू करा.</translation>
@@ -46,7 +45,6 @@
 <translation id="7265369419224458312">तुम्ही तुमच्या कॉंप्युटरवर उघडलेल्‍या टॅबमध्‍ये, थेट येथून अॅक्सेस करा.
 तुमच्या कॉंप्युटरवर फक्त Chrome उघडा, मेनूवर जा आणि "Chrome वर साइन इन करा…" निवडा</translation>
 <translation id="7400722733683201933">Google Chrome बद्दल</translation>
-<translation id="7437998757836447326">Chrome मधून साइन आउट करा</translation>
 <translation id="756809126120519699">Chrome डेटा साफ केला</translation>
 <translation id="7626032353295482388">Chrome मध्ये स्वागत आहे</translation>
 <translation id="7698568245838009292">Chrome ला कॅमेरा अॅक्सेस करायचा आहे</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ms.xtb
index b36399aa..105a972 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ms.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ms.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Dapatkan pengalaman yang lebih baik dalam Chrome berdasarkan lokasi anda.</translation>
 <translation id="424864128008805179">Log keluar daripada Chrome?</translation>
 <translation id="4523886039239821078">Beberapa tambahan menyebabkan Chrome ranap. Sila nyahpasang:</translation>
-<translation id="4615174829807303908">Anda log keluar daripada akaun yang diurus oleh <ph name="SIGNOUT_MANAGED_DOMAIN" />. Tindakan ini akan memadamkan data Chrome anda daripada peranti ini, tetapi data anda akan kekal dalam akaun Google anda.</translation>
 <translation id="5389212809648216794">Google Chrome tidak dapat menggunakan kamera anda kerana kamera sedang digunakan oleh aplikasi lain</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Semak Syarat Perkhidmatan Chrome yang dikemas kini.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Buka Tetapan &gt; Privasi &gt; Kamera &gt; Google Chrome dan hidupkan kamera.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome menggunakan ID Wajah untuk memastikan akses yang dibenarkan kepada kata laluan anda.</translation>
 <translation id="7265369419224458312">Akses tab yang telah anda buka pada komputer anda, terus dari sini. Cuma buka Chrome pada komputer anda, pergi ke menu dan pilih  “Log masuk ke Chrome…”</translation>
 <translation id="7400722733683201933">Mengenai Google Chrome</translation>
-<translation id="7437998757836447326">Log keluar dari Chrome</translation>
 <translation id="756809126120519699">Data Chrome dikosongkan</translation>
 <translation id="7626032353295482388">Selamat Datang ke Chrome</translation>
 <translation id="7698568245838009292">Chrome Ingin Mengakses Kamera Anda</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_nl.xtb
index d296ef6..971addb2 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_nl.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Gebruik Google beter in Chrome op basis van je locatie.</translation>
 <translation id="424864128008805179">Uitloggen bij Chrome?</translation>
 <translation id="4523886039239821078">Sommige add-ons kunnen ervoor zorgen dat Chrome crasht. Verwijder de volgende add-ons:</translation>
-<translation id="4615174829807303908">Je logt uit van een account dat wordt beheerd door <ph name="SIGNOUT_MANAGED_DOMAIN" />. Hierdoor worden je Chrome-gegevens verwijderd van dit apparaat. Je gegevens blijven echter opgeslagen in je Google-account.</translation>
 <translation id="5389212809648216794">Google Chrome kan je camera niet gebruiken omdat deze wordt gebruikt door een andere app</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />De geüpdatete servicevoorwaarden van Chrome bekijken<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Open Instellingen &gt; Privacy &gt; Camera &gt; Google Chrome en zet de camera aan.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome gebruikt Face ID om geautoriseerde toegang tot je wachtwoorden mogelijk te maken.</translation>
 <translation id="7265369419224458312">Bekijk hier de tabbladen die je op je computer hebt geopend. Open Chrome op je computer, ga naar het menu en selecteer 'Inloggen bij Chrome'.</translation>
 <translation id="7400722733683201933">Over Google Chrome</translation>
-<translation id="7437998757836447326">Uitloggen bij Chrome</translation>
 <translation id="756809126120519699">Chrome-gegevens gewist</translation>
 <translation id="7626032353295482388">Welkom bij Chrome</translation>
 <translation id="7698568245838009292">Chrome vraagt toegang tot de camera</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb
index 71b935ff..16ec1e1 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Få en bedre Google-opplevelse i Chrome basert på hvor du er.</translation>
 <translation id="424864128008805179">Vil du logge av Chrome?</translation>
 <translation id="4523886039239821078">Noen tillegg fører til at Chrome krasjer. Avinstaller:</translation>
-<translation id="4615174829807303908">Du logger av en konto som administreres av <ph name="SIGNOUT_MANAGED_DOMAIN" />. Dette sletter Chrome-dataene dine fra denne enheten, men dataene blir værende i Google-kontoen din.</translation>
 <translation id="5389212809648216794">Google Chrome kan ikke bruke kameraet fordi det brukes av en annen app</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Gjennomgå de oppdaterte vilkårene for Chrome.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Åpne Innstillinger &gt; Personvern &gt; Kamera &gt; Google Chrome, og slå på kameraet.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome bruker Face ID til å sikre at bare godkjente personer får tilgang til passordene dine.</translation>
 <translation id="7265369419224458312">Du kan bruke fanene du har åpne på datamaskinen, direkte herfra. Bare åpne Chrome på datamaskinen, gå til menyen, og velg «Logg på Chrome».</translation>
 <translation id="7400722733683201933">Om Google Chrome</translation>
-<translation id="7437998757836447326">Logg av Chrome</translation>
 <translation id="756809126120519699">Chrome-dataene er slettet</translation>
 <translation id="7626032353295482388">Velkommen til Chrome</translation>
 <translation id="7698568245838009292">Chrome vil ha tilgang til kameraet</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pl.xtb
index 10a932fe..c258024b 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pl.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Włączenie udostępniania lokalizacji w Chrome pozwala w pełni korzystać z usług Google.</translation>
 <translation id="424864128008805179">Wylogować z Chrome?</translation>
 <translation id="4523886039239821078">Niektóre dodatki mogą powodować awarie Chrome. Odinstaluj je.</translation>
-<translation id="4615174829807303908">Wylogowujesz się z konta, którym zarządza <ph name="SIGNOUT_MANAGED_DOMAIN" />. Spowoduje to usunięcie danych Chrome z tego urządzenia, ale pozostaną one na koncie Google.</translation>
 <translation id="5389212809648216794">Google Chrome nie może użyć aparatu, bo używa go już inna aplikacja</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Zapoznaj się ze zaktualizowanymi Warunkami korzystania z usługi Chrome<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Wybierz Ustawienia &gt; Prywatność &gt; Aparat &gt; Google Chrome i włącz aparat.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome używa Face ID do autoryzacji dostępu do Twoich haseł.</translation>
 <translation id="7265369419224458312">Tutaj możesz korzystać z kart otwartych na komputerze. Wystarczy uruchomić Chrome na komputerze i w menu wybrać „Zaloguj się w Chrome”.</translation>
 <translation id="7400722733683201933">Google Chrome – informacje</translation>
-<translation id="7437998757836447326">Wyloguj się z Chrome</translation>
 <translation id="756809126120519699">Wyczyszczono dane Chrome</translation>
 <translation id="7626032353295482388">Witamy w Chrome</translation>
 <translation id="7698568245838009292">Chrome chce mieć dostęp do kamery</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-BR.xtb
index 8de6953..463ae53f 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-BR.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-BR.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Melhore sua experiência do Google no Chrome de acordo com seu local.</translation>
 <translation id="424864128008805179">Sair do Google Chrome?</translation>
 <translation id="4523886039239821078">Alguns complementos causam a falha do Google Chrome. Desinstale-os.</translation>
-<translation id="4615174829807303908">Você está saindo de uma conta gerenciada por <ph name="SIGNOUT_MANAGED_DOMAIN" />. Os dados do Chrome serão excluídos desse dispositivo, mas permanecerão na sua Conta do Google.</translation>
 <translation id="5389212809648216794">O Google Chrome não pode usar a câmera porque ela está sendo usada por outro app</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Leia os Termos de Serviço atualizados do Chrome.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Abra Ajustes &gt; Privacidade &gt; Câmera &gt; Google Chrome e ative a câmera.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">O Chrome usa o Face ID para garantir o acesso autorizado às suas senhas.</translation>
 <translation id="7265369419224458312">Acesse as guias que você abriu no seu computador, bem aqui. Basta abrir o Chrome no computador, ir até o menu e selecionar “Fazer login no Google Chrome…”</translation>
 <translation id="7400722733683201933">Sobre o Google Chrome</translation>
-<translation id="7437998757836447326">Sair do Google Chrome</translation>
 <translation id="756809126120519699">Dados do Chrome apagados</translation>
 <translation id="7626032353295482388">Bem-vindo ao Google Chrome</translation>
 <translation id="7698568245838009292">Solicitação do Chrome para acessar a câmera</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-PT.xtb
index 4203554..112af833 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-PT.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-PT.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Obter uma melhor experiência no Google Chrome com base na sua localização.</translation>
 <translation id="424864128008805179">Pretende terminar sessão no Chrome?</translation>
 <translation id="4523886039239821078">Alguns suplementos provocam falhas no sistema do Chrome. Desinstale:</translation>
-<translation id="4615174829807303908">Está a terminar sessão numa conta gerida por <ph name="SIGNOUT_MANAGED_DOMAIN" />. Esta ação elimina os seus dados do Chrome deste dispositivo, embora permaneçam na Conta Google.</translation>
 <translation id="5389212809648216794">O Google Chrome não pode utilizar a câmara porque está a ser utilizada por outra aplicação</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Consulte os Termos de Utilização do Chrome atualizados.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Abra Definições &gt; Privacidade &gt; Câmara &gt; Google Chrome e ative a câmara.</translation>
@@ -44,7 +43,6 @@
 <translation id="7173660919484573146">O Chrome utiliza o Face ID para assegurar o acesso autorizado às suas palavras-passe.</translation>
 <translation id="7265369419224458312">Aceda aqui aos separadores abertos no computador. Basta abrir o Chrome no computador, aceder ao menu e selecionar "Iniciar sessão no Chrome..."</translation>
 <translation id="7400722733683201933">Acerca do Google Chrome</translation>
-<translation id="7437998757836447326">Terminar sessão no Chrome</translation>
 <translation id="756809126120519699">Dados do Chrome limpos</translation>
 <translation id="7626032353295482388">Bem-vindo ao Chrome</translation>
 <translation id="7698568245838009292">O Chrome pretende aceder à câmara</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb
index 9aa0d4c5..d91d86c 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Beneficiază de o experiență Google mai bună în Chrome pe baza locației.</translation>
 <translation id="424864128008805179">Te deconectezi de la Chrome?</translation>
 <translation id="4523886039239821078">Unele suplimente determină blocarea browserului Chrome. Dezinstalează:</translation>
-<translation id="4615174829807303908">Te deconectezi de la un cont gestionat de <ph name="SIGNOUT_MANAGED_DOMAIN" />. Astfel, se vor șterge datele Chrome de pe acest dispozitiv, dar datele vor rămâne în Contul Google.</translation>
 <translation id="5389212809648216794">Google Chrome nu poate folosi camera foto, deoarece este folosită de o altă aplicație</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Citește Termenii și condițiile Chrome actualizate.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Deschide Setări &gt; Confidențialitate &gt; Cameră foto &gt; Google Chrome și activează camera foto.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome folosește Face ID pentru a asigura accesul autorizat la parolele tale.</translation>
 <translation id="7265369419224458312">Accesează chiar aici filele pe care le-ai deschis pe computer. Deschide Chrome pe computer, accesează meniul și selectează „Conectează-te la Chrome...”</translation>
 <translation id="7400722733683201933">Despre Google Chrome</translation>
-<translation id="7437998757836447326">Deconectează-te de la Chrome</translation>
 <translation id="756809126120519699">Datele Chrome au fost șterse</translation>
 <translation id="7626032353295482388">Bun venit la Chrome</translation>
 <translation id="7698568245838009292">Chrome vrea să acceseze camera foto</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb
index 7abbbbc..7472429 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Разрешите браузеру определять ваше местоположение и пользуйтесь дополнительными возможностями Chrome.</translation>
 <translation id="424864128008805179">Выйти из Chrome?</translation>
 <translation id="4523886039239821078">Некоторые дополнения вызывают сбой Chrome. Необходимо удалить:</translation>
-<translation id="4615174829807303908">Вы выходите из аккаунта, которым управляет администратор домена <ph name="SIGNOUT_MANAGED_DOMAIN" />. Все данные Chrome, хранящиеся на этом устройстве, будут удалены, но останутся в вашем аккаунте Google.</translation>
 <translation id="5389212809648216794">Google Chrome не может получить доступ к камере, поскольку она используется другим приложением.</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Ознакомьтесь с обновленными Условиями использования Chrome<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Откройте "Настройки &gt; Конфиденциальность &gt; Камера &gt; Chrome" и включите камеру.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Чтобы исключить несанкционированный доступ к паролям, Chrome использует функцию Face ID.</translation>
 <translation id="7265369419224458312">Просматривайте одни и те же вкладки на компьютере и мобильном устройстве. Для этого откройте меню браузера на компьютере и выберите пункт "Войти в Chrome".</translation>
 <translation id="7400722733683201933">О браузере Google Chrome</translation>
-<translation id="7437998757836447326">Выход из Chrome</translation>
 <translation id="756809126120519699">Данные Chrome удалены</translation>
 <translation id="7626032353295482388">Добро пожаловать в Chrome!</translation>
 <translation id="7698568245838009292">Приложению Chrome нужен доступ к камере</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sk.xtb
index c92f27a9..45946c9 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sk.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sk.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Služby Google môžu v prehliadači Chrome vďaka údajom o polohe fungovať lepšie.</translation>
 <translation id="424864128008805179">Odhlásiť sa z Chromu?</translation>
 <translation id="4523886039239821078">Niektoré doplnky spôsobujú zlyhanie prehliadača Chrome. Odinštalujte ich.</translation>
-<translation id="4615174829807303908">Odhlasujete sa z účtu spravovaného doménou <ph name="SIGNOUT_MANAGED_DOMAIN" />. Týmto odstránite údaje prehliadača Chrome z príslušného zariadenia, avšak zostanú naďalej vo vašom účte Google.</translation>
 <translation id="5389212809648216794">Google Chrome nemôže použiť váš fotoaparát, pretože ho práve používa iná aplikácia</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Aktualizované zmluvné podmienky prehliadača Chrome<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Otvorte Nastavenia &gt; Súkromie &gt; Fotoaparát &gt; Google Chrome a zapnite fotoaparát.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome používa overenie Face ID na zaistenie oprávneného prístupu k heslám.</translation>
 <translation id="7265369419224458312">Priamo tu môžete pristupovať ku kartám, ktoré máte otvorené na počítači. Stačí otvoriť Chrome na počítači, prejsť do ponuky a vybrať možnosť „Prihlásiť sa do prehliadača Chrome…“.</translation>
 <translation id="7400722733683201933">O aplikácii Google Chrome</translation>
-<translation id="7437998757836447326">Odhlásiť sa z Chromu</translation>
 <translation id="756809126120519699">Údaje Chromu boli vymazané</translation>
 <translation id="7626032353295482388">Víta vás prehliadač Chrome</translation>
 <translation id="7698568245838009292">Chrome chce použiť fotoaparát</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb
index 0557f75..ee1943e 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Get a better Google experience in Chrome based on your location.</translation>
 <translation id="424864128008805179">Se želite odjaviti iz Chroma?</translation>
 <translation id="4523886039239821078">Nekateri dodatki povzročajo zrušitve Chroma. Odstranite jih:</translation>
-<translation id="4615174829807303908">Odjavili se boste iz računa, ki ga upravlja <ph name="SIGNOUT_MANAGED_DOMAIN" />. S tem boste iz te naprave izbrisali podatke v Chromu, vendar bodo vaši podatki še vedno na voljo v Google Računu.</translation>
 <translation id="5389212809648216794">Google Chrome ne more uporabljati fotoaparata, ker ga uporablja druga aplikacija</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Oglejte si posodobljene pogoje storitve za Chrome.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Odprite Settings &gt; Privacy &gt; Camera &gt; Google Chrome in vklopite fotoaparat.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome uporablja funkcijo Face ID za zagotavljanje pooblaščenega dostopa do vaših gesel.</translation>
 <translation id="7265369419224458312">Do zavihkov, odprtih v računalniku, lahko dostopate tukaj. V računalniku odprite Chrome, nato meni in izberite »Prijava v Chrome …«.</translation>
 <translation id="7400722733683201933">O brskalniku Google Chrome</translation>
-<translation id="7437998757836447326">Odjava iz Chroma</translation>
 <translation id="756809126120519699">Chromovi podatki so izbrisani.</translation>
 <translation id="7626032353295482388">Dobrodošli v Chromu</translation>
 <translation id="7698568245838009292">Chrome želi dostopati do fotoaparata</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sr.xtb
index 895ada3..e9f80859 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sr.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Побољшајте Google доживљај у Chrome-у на основу локације.</translation>
 <translation id="424864128008805179">Желите ли да се одјавите из Chrome-а?</translation>
 <translation id="4523886039239821078">Неки програмски додаци изазивају отказивање Chrome-а. Деинсталирајте:</translation>
-<translation id="4615174829807303908">Одјављујете се са налога којим управља <ph name="SIGNOUT_MANAGED_DOMAIN" />. То ће избрисати Chrome податке са овог уређаја, али ће подаци остати на Google налогу.</translation>
 <translation id="5389212809648216794">Google Chrome не може да користи камеру зато што је већ користи друга апликација</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Прегледајте ажуриране Chrome услове коришћења услуге.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Отворите Подешавања &gt; Приватност &gt; Камера &gt; Google Chrome и укључите камеру.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome користи Face ID да би лозинкама могле да приступају само овлашћене особе.</translation>
 <translation id="7265369419224458312">Овде приступајте картицама које сте отворили на рачунару. Само отворите Chrome на рачунару, идите на мени и изаберите „Пријави ме у Chrome...“</translation>
 <translation id="7400722733683201933">О програму Google Chrome</translation>
-<translation id="7437998757836447326">Одјављивање из Chrome-а</translation>
 <translation id="756809126120519699">Chrome подаци су обрисани</translation>
 <translation id="7626032353295482388">Добро дошли у Chrome</translation>
 <translation id="7698568245838009292">Chrome жели да приступи камери</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sv.xtb
index 78eb656..b8c36b2 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sv.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sv.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Ange din plats och få en bättre upplevelse av Google när du använder Chrome.</translation>
 <translation id="424864128008805179">Vill du logga ut från Chrome?</translation>
 <translation id="4523886039239821078">Några tillägg har fått Chrome att krascha. Avinstallera följande:</translation>
-<translation id="4615174829807303908">Du håller på att logga ut från ett konto som hanteras av <ph name="SIGNOUT_MANAGED_DOMAIN" />. Åtgärden raderar din data i Chrome från den här enheten, men den finns kvar på Google-kontot.</translation>
 <translation id="5389212809648216794">Google Chrome kan inte använda kameran eftersom den används av en annan app</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Läs de uppdaterade användarvillkoren för Chrome.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Öppna Inställningar &gt; Sekretess &gt; Kamera &gt; Google Chrome och aktivera kameran.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome använder Face ID för att se till att endast behöriga har åtkomst till lösenorden.</translation>
 <translation id="7265369419224458312">Använd flikar som du öppnar på datorn även här. Du behöver bara öppna Chrome på datorn, öppna menyn och välja Logga in i Chrome …</translation>
 <translation id="7400722733683201933">Om Google Chrome</translation>
-<translation id="7437998757836447326">Logga ut från Chrome</translation>
 <translation id="756809126120519699">Data i Chrome har rensats</translation>
 <translation id="7626032353295482388">Välkommen till Chrome</translation>
 <translation id="7698568245838009292">Chrome vill ha tillgång till kameran</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sw.xtb
index cca3fe2..b5fef54 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sw.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sw.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Pata hali bora ya Google katika Chrome kulingana na mahali ulipo.</translation>
 <translation id="424864128008805179">Ungependa kuondoka kwenye Chrome?</translation>
 <translation id="4523886039239821078">Baadhi ya programu jalizi husababisha Chrome iache kufanya kazi. Tafadhali ondoa:</translation>
-<translation id="4615174829807303908">Unaondoka kwenye akaunti inayodhibitiwa na <ph name="SIGNOUT_MANAGED_DOMAIN" />. Hatua hii itafuta data yako ya Chrome kwenye kifaa hiki, lakini data yako itasalia katika akaunti yako ya Google.</translation>
 <translation id="5389212809648216794">Google Chrome imeshindwa kutumia kamera yako kwa sababu inatumiwa na programu nyingine</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Kagua Sheria na Masharti ya Chrome yaliyosasishwa.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Fungua Mipangilio &gt; Faragha &gt; Kamera &gt; Google Chrome na uwashe kamera.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome hutumia Kitambulisho cha Uso ili kuhakikisha ufikiaji ulioidhinishwa wa manenosiri yako.</translation>
 <translation id="7265369419224458312">Fikia vichupo ambavyo viko wazi kwenye kompyuta yako, papa hapa. Fungua Chrome kwenye kompyuta yako, nenda kwenye menyu, na uchague “Ingia katika Chrome…”</translation>
 <translation id="7400722733683201933">Kuhusu Google Chrome</translation>
-<translation id="7437998757836447326">Ondoka kwenye Chrome</translation>
 <translation id="756809126120519699">Data ya Chrome imefutwa</translation>
 <translation id="7626032353295482388">Karibu kwenye Chrome</translation>
 <translation id="7698568245838009292">Chrome Inataka Kufikia Kamera</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ta.xtb
index 3d9cc8a..863786bc 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ta.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">உங்கள் இருப்பிடத்தின் அடிப்படையில், Chrome இல் சிறந்த Google அனுபவத்தைப் பெறவும்.</translation>
 <translation id="424864128008805179">Chrome இலிருந்து வெளியேறவா?</translation>
 <translation id="4523886039239821078">சில செருகு நிரல்களினால் Chrome சிதைவுக்குட்படுகிறது. பின்வருபவற்றை நிறுவல் நீக்கம் செய்யவும்:</translation>
-<translation id="4615174829807303908"><ph name="SIGNOUT_MANAGED_DOMAIN" /> நிர்வகிக்கும் கணக்கிலிருந்து வெளியேறுகிறீர்கள். இவ்வாறு செய்வதால், இந்தச் சாதனத்திலிருந்து Chrome தரவு நீக்கப்படும், எனினும் உங்கள் Google கணக்கில் தரவு தொடர்ந்து இருக்கும்.</translation>
 <translation id="5389212809648216794">கேமராவை மற்றொரு ஆப்ஸ் உபயோகிப்பதால், Google Chrome ஆல் அதைப் பயன்படுத்த முடியாது</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />மாற்றப்பட்ட Chrome சேவை விதிமுறைகளைப் படித்துப் பாருங்கள்.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">அமைப்புகள் &gt; தனியுரிமை &gt; கேமரா &gt; Google Chrome என்பதைத் திறந்து, கேமராவை இயக்கவும்.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">உங்கள் கடவுச்சொற்களை அணுக அங்கீகரிக்கப்பட்டவர்களை மட்டும் அனுமதிப்பதற்காக Face IDயை Chrome பயன்படுத்துகிறது.</translation>
 <translation id="7265369419224458312">உங்கள் கம்ப்யூட்டரில் திறக்கப்பட்டிருக்கும் தாவல்களை இங்கிருந்தே அணுகலாம். உங்கள் கம்ப்யூட்டரில் Chromeமைத் திறந்து மெனுவிற்குச் சென்று, "Chromeமில் உள்நுழை..." என்பதைத் தேர்ந்தெடுக்கவும்</translation>
 <translation id="7400722733683201933">Google Chrome பற்றி</translation>
-<translation id="7437998757836447326">Chrome இலிருந்து வெளியேறுதல்</translation>
 <translation id="756809126120519699">Chrome தரவு அழிக்கப்பட்டது</translation>
 <translation id="7626032353295482388">Chrome க்கு வருக</translation>
 <translation id="7698568245838009292">Chrome 'கேமராவைப்’ பயன்படுத்த விரும்புகிறது</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_te.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_te.xtb
index 4a26640..35f4098 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_te.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">మీ స్థానం ఆధారంగా Chromeలో మెరుగైన Google అనుభవాన్ని పొందండి.</translation>
 <translation id="424864128008805179">Chrome నుండి సైన్ అవుట్ చేయాలా?</translation>
 <translation id="4523886039239821078">కొన్ని యాడ్-ఆన్‌లు Chrome క్రాష్ అయ్యేలా చేశాయి. దయచేసి వీటిని అన్‌ఇన్‌స్టాల్ చేయండి:</translation>
-<translation id="4615174829807303908">మీరు <ph name="SIGNOUT_MANAGED_DOMAIN" /> నిర్వహణలో ఉన్న ఖాతా నుండి సైన్ అవుట్ చేస్తున్నారు. దీని వ‌ల్ల మీ Chrome డేటా ఈ పరికరం నుండి తొలగించబడుతుంది. కానీ మీ డేటా మీ Google ఖాతాలో అలాగే ఉంటుంది.</translation>
 <translation id="5389212809648216794">మీ కెమెరాను మరొక అప్లికేషన్‌ ఉపయోగిస్తున్నందున Google Chrome దాన్ని ఉపయోగించలేదు</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />అప్‌డేట్ చేయబడిన Chromeసేవా నిబంధనలను సమీక్షించండి.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">సెట్టింగ్‌లు &gt; గోప్యత &gt; కెమెరా &gt; Google Chromeని తెరిచి, కెమెరాను ఆన్ చేయండి.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome మీ పాస్‌వర్డ్‌లను ప్రమాణీకరణ ఉన్న వారు మాత్రమే యాక్సెస్ చేస్తున్నట్లు నిర్ధారించడం కోసం ఫేస్ IDని ఉపయోగిస్తుంది.</translation>
 <translation id="7265369419224458312">మీరు మీ కంప్యూటర్‌లో తెరిచిన ట్యాబ్‌లను ఇక్కడి నుండే యాక్సెస్ చేయండి. మీ కంప్యూటర్‌లో Chromeను తెరిచి, మెనూకు వెళ్లి, “Chromeకు సైన్ ఇన్ చేయి…” ఎంచుకోండి</translation>
 <translation id="7400722733683201933">Google Chrome గురించి</translation>
-<translation id="7437998757836447326">Chrome నుండి సైన్ అవుట్ చేయండి</translation>
 <translation id="756809126120519699">Chrome డేటా తీసివేయబడింది</translation>
 <translation id="7626032353295482388">Chromeకు స్వాగతం</translation>
 <translation id="7698568245838009292">కెమెరాను Chrome యాక్సెస్ చేయాలనుకుంటోంది</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb
index 962013a..6188e7f 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_th.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">รับประสบการณ์การใช้งาน Google ที่ดีขึ้นใน Chrome โดยอิงตามตำแหน่งของคุณ</translation>
 <translation id="424864128008805179">ต้องการออกจากระบบ Chrome ไหม</translation>
 <translation id="4523886039239821078">ส่วนเสริมบางรายการทำให้ Chrome ขัดข้อง โปรดถอนการติดตั้ง</translation>
-<translation id="4615174829807303908">คุณกำลังออกจากระบบบัญชีที่จัดการโดย <ph name="SIGNOUT_MANAGED_DOMAIN" /> การออกจากระบบจะลบข้อมูล Chrome ของคุณออกจากอุปกรณ์เครื่องนี้ แต่ข้อมูลจะยังคงอยู่ในบัญชี Google</translation>
 <translation id="5389212809648216794">Google Chrome ไม่สามารถใช้กล้องถ่ายรูปเนื่องจากแอปพลิเคชันอื่นใช้งานอยู่</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />อ่านข้อกำหนดในการให้บริการของ Chrome ที่อัปเดต<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">เปิดการตั้งค่า &gt; ความเป็นส่วนตัว &gt; กล้อง &gt; Google Chrome เพื่อเปิดกล้องถ่ายรูป</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome ใช้ Face ID เพื่อยืนยันสิทธิ์ในการเข้าถึงรหัสผ่าน</translation>
 <translation id="7265369419224458312">เข้าถึงแท็บที่คุณเปิดไว้ในคอมพิวเตอร์ได้ที่นี่ เพียงเปิด Chrome บนคอมพิวเตอร์ของคุณ ไปที่เมนู แล้วเลือก “ลงชื่อเข้าใช้ Chrome…”</translation>
 <translation id="7400722733683201933">เกี่ยวกับ Google Chrome</translation>
-<translation id="7437998757836447326">ออกจากระบบ Chrome</translation>
 <translation id="756809126120519699">ล้างข้อมูล Chrome แล้ว</translation>
 <translation id="7626032353295482388">ยินดีต้อนรับสู่ Chrome</translation>
 <translation id="7698568245838009292">Chrome ต้องการเข้าถึงกล้องถ่ายรูป</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb
index a24c299..80ad8c6 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Chrome'da, konumunuza dayalı olarak daha iyi bir Google deneyimi yaşayın.</translation>
 <translation id="424864128008805179">Chrome oturumu kapatılsın mı?</translation>
 <translation id="4523886039239821078">Bazı eklentiler Chrome'un kilitlenmesine neden oluyor. Lütfen şunların yüklemelerini kaldırın:</translation>
-<translation id="4615174829807303908"><ph name="SIGNOUT_MANAGED_DOMAIN" /> tarafından yönetilen bir hesabın oturumunu kapatıyorsunuz. Bu işlemle Chrome verileriniz bu cihazdan silinir, ancak Google hesabınızda kalmaya devam eder.</translation>
 <translation id="5389212809648216794">Kameranız başka bir uygulama tarafından kullanıldığından Google Chrome, kameranızı kullanamıyor.</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Güncellenen Chrome Hizmet Şartları'nı inceleyin.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Ayarlar &gt; Gizlilik &gt; Kamera &gt; Google Chrome'a gidin ve kamerayı açın.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome, şifrelerinize yetkili erişim sağlanması için Face ID kullanır.</translation>
 <translation id="7265369419224458312">Bilgisayarınızda açtığınız sekmelere doğrudan buradan erişin. Bunun için bilgisayarınızda Chrome'u açmanız ve menüye gidip "Chrome'da oturum aç…" seçeneğini belirlemeniz yeterlidir.</translation>
 <translation id="7400722733683201933">Google Chrome hakkında</translation>
-<translation id="7437998757836447326">Chrome oturumunu kapatma</translation>
 <translation id="756809126120519699">Chrome verileri temizlendi</translation>
 <translation id="7626032353295482388">Chrome'a Hoş Geldiniz</translation>
 <translation id="7698568245838009292">Chrome, Kameraya Erişmek İstiyor</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_uk.xtb
index 80aa229..96a6e8e 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_uk.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Знаючи ваше місцезнаходження, Google зможе створити для вас зручніші умови роботи в Chrome.</translation>
 <translation id="424864128008805179">Вийти з Chrome?</translation>
 <translation id="4523886039239821078">Деякі додатки спричиняють аварійне завершення роботи Chrome. Видаліть такі додатки:</translation>
-<translation id="4615174829807303908">Ви виходите з облікового запису, зареєстрованого в домені <ph name="SIGNOUT_MANAGED_DOMAIN" />. Дані Chrome буде видалено з цього пристрою, але вони залишаться у вашому обліковому записі Google.</translation>
 <translation id="5389212809648216794">Зараз Google Chrome не може використовувати камеру, оскільки її використовує інший додаток</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Перегляньте оновлені Умови використання Chrome.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Відкрийте меню "Параметри" &gt; "Приватність" &gt; "Камера" &gt; "Google Chrome" і ввімкніть камеру.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome використовує Face ID, щоб забезпечити авторизований доступ до ваших паролів.</translation>
 <translation id="7265369419224458312">Тут ви можете переглядати вкладки, відкриті на комп’ютері. Просто запустіть Chrome на комп’ютері, перейдіть у меню та виберіть "Увійти в Chrome…"</translation>
 <translation id="7400722733683201933">Про Google Chrome</translation>
-<translation id="7437998757836447326">Вихід із Chrome</translation>
 <translation id="756809126120519699">Дані Chrome видалено</translation>
 <translation id="7626032353295482388">Вітаємо у Chrome!</translation>
 <translation id="7698568245838009292">Chrome потрібен доступ до камери</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_vi.xtb
index b59665a..682b2ca 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_vi.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_vi.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">Nhận trải nghiệm Google tốt hơn trong Chrome dựa vào vị trí của bạn.</translation>
 <translation id="424864128008805179">Đăng xuất khỏi Chrome?</translation>
 <translation id="4523886039239821078">Một số tiện ích bổ sung khiến Chrome trục trặc. Hãy gỡ cài đặt:</translation>
-<translation id="4615174829807303908">Bạn đang đăng xuất khỏi tài khoản do <ph name="SIGNOUT_MANAGED_DOMAIN" /> quản lý. Thao tác này sẽ xóa dữ liệu Chrome khỏi thiết bị này nhưng dữ liệu đó sẽ vẫn còn trong tài khoản Google của bạn.</translation>
 <translation id="5389212809648216794">Google Chrome không thể sử dụng máy ảnh của bạn do một ứng dụng khác đang dùng máy ảnh</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />Xem lại Điều khoản dịch vụ đã cập nhật của Chrome.<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">Mở Cài đặt &gt; Bảo mật &gt; Máy ảnh &gt; Google Chrome và bật máy ảnh.</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome sử dụng Face ID để đảm bảo chỉ những người được ủy quyền mới có thể truy cập vào mật khẩu của bạn.</translation>
 <translation id="7265369419224458312">Truy cập các tab bạn đã mở trên máy tính của mình, ngay tại đây. Bạn chỉ cần mở Chrome trên máy tính của mình, chuyển tới menu và chọn "Đăng nhập vào Chrome…”</translation>
 <translation id="7400722733683201933">Giới thiệu về Google Chrome</translation>
-<translation id="7437998757836447326">Đăng xuất khỏi Chrome</translation>
 <translation id="756809126120519699">Đã xóa dữ liệu Chrome</translation>
 <translation id="7626032353295482388">Chào mừng bạn đến với Chrome</translation>
 <translation id="7698568245838009292">Chrome muốn truy cập vào máy ảnh</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-CN.xtb
index 961de02b..c075938 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-CN.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-CN.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">要在 Chrome 中获得更好的 Google 使用体验,需要用到您的位置信息。</translation>
 <translation id="424864128008805179">退出 Chrome?</translation>
 <translation id="4523886039239821078">部分插件导致 Chrome 崩溃,请卸载这些插件:</translation>
-<translation id="4615174829807303908">您正要退出由 <ph name="SIGNOUT_MANAGED_DOMAIN" /> 管理的帐号。退出后,您的 Chrome 数据将从这台设备上删除,但仍会保留在您的 Google 帐号中。</translation>
 <translation id="5389212809648216794">由于另一个应用正在使用您的相机,因此 Google Chrome 无法使用</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />查看新版 Chrome 服务条款。<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">打开“设置”&gt;“隐私”&gt;“相机”&gt;“Google Chrome”,然后开启相机。</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome 会使用 Face ID 来确保对您密码的访问均已获授权。</translation>
 <translation id="7265369419224458312">您可直接在此处使用您在计算机上打开的标签页。只需在计算机上打开 Chrome,转到菜单,然后选择“登录 Chrome…”即可</translation>
 <translation id="7400722733683201933">关于Google Chrome</translation>
-<translation id="7437998757836447326">退出 Chrome</translation>
 <translation id="756809126120519699">已清除 Chrome 数据</translation>
 <translation id="7626032353295482388">欢迎使用 Chrome</translation>
 <translation id="7698568245838009292">Chrome 想要访问相机</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-TW.xtb
index 65763d9d..e5939222 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-TW.xtb
@@ -26,7 +26,6 @@
 <translation id="415767770115540173">在您使用 Chrome 時,讓 Google 根據您的位置資訊提供更優質的服務。</translation>
 <translation id="424864128008805179">要登出 Chrome 嗎?</translation>
 <translation id="4523886039239821078">部分外掛程式造成 Chrome 當機,請解除安裝這些外掛程式:</translation>
-<translation id="4615174829807303908">您即將登出由 <ph name="SIGNOUT_MANAGED_DOMAIN" /> 所管理的帳戶。系統會將您的 Chrome 資料從這個裝置上刪除,但繼續保留在您的 Google 帳戶中。</translation>
 <translation id="5389212809648216794">另一個應用程式正在使用你的相機,因此 Google Chrome 無法使用</translation>
 <translation id="5621912349729388018"><ph name="BEGIN_LINK" />查看更新的 Chrome 服務條款。<ph name="END_LINK" /></translation>
 <translation id="5639704535586432836">請前往 [設定] &gt; [隱私權] &gt; [相機] &gt; [Google Chrome],並開啟相機。</translation>
@@ -45,7 +44,6 @@
 <translation id="7173660919484573146">Chrome 會使用 Face ID 來確保只有經過授權的使用者才能存取你的密碼。</translation>
 <translation id="7265369419224458312">只要在電腦上開啟 Chrome 並前往選單中選取 [登入 Chrome...],即可直接在這裡使用您在電腦上開啟的所有分頁。</translation>
 <translation id="7400722733683201933">關於 Google Chrome</translation>
-<translation id="7437998757836447326">登出 Chrome</translation>
 <translation id="756809126120519699">已清除 Chrome 資料</translation>
 <translation id="7626032353295482388">歡迎使用 Chrome</translation>
 <translation id="7698568245838009292">Chrome 要求存取你的相機</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb
index f60949c..41a21cb2e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">የምንጊዜም</translation>
 <translation id="4338650699862464074">የሚጎበኟቸው የገጾች ዩአርኤሎችን ወደ Google ይላኩ።</translation>
 <translation id="4359125752503270327">ይህ ገጽ በሌላ መተግበሪያ ውስጥ ይከፈታል።</translation>
-<translation id="4370827530403103842">ስምረት እየሠራ አይደለም። ለማስተካከል መታ ያድርጉ።</translation>
 <translation id="4375040482473363939">የQR ኮድ ፍለጋ</translation>
 <translation id="4378154925671717803">ስልክ</translation>
 <translation id="441868831736628555">የግላዊነት ማሳወቂያ</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">የይዘት ቅንብሮች </translation>
 <translation id="7015203776128479407">የመጀመሪያው የስምረት ውቅረት አላለቀም። ስምረት ጠፍቷል።</translation>
 <translation id="7029809446516969842">የይለፍ ቃላት</translation>
-<translation id="7031882061095297553">አሥምር ወደ</translation>
 <translation id="7053983685419859001">አግድ</translation>
 <translation id="7062545763355031412">ይቀበሉ እና መለያዎችን ይቀይሩ</translation>
 <translation id="7099761977003084116">የቅርብ ጊዜ ትሮች</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">ሙሉ ስም</translation>
 <translation id="7136892417564438900">ካሜራ አይገኝም</translation>
 <translation id="7159472599653637159">የተንቀሳቃሽ ስልክ ጣቢያ ጠይቅ</translation>
-<translation id="7167621057293532233">የውሂብ ዓይነቶች</translation>
 <translation id="7173114856073700355">ቅንብሮችን ክፈት</translation>
 <translation id="7189598951263744875">አጋራ...</translation>
 <translation id="7192050974311852563">መግባት ይጀምሩ</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">ድሩን በግል ለማሰስ አዲስ ትር ያክሉ።</translation>
 <translation id="7671141431838911305">ጫን</translation>
 <translation id="7765158879357617694">ውሰድ</translation>
-<translation id="7769602470925380267">ተቀበልና ዘግተህ ውጣ</translation>
 <translation id="7772032839648071052">የይለፍ ሐረግ ያረጋግጡ</translation>
 <translation id="7781829728241885113">ትናንት</translation>
 <translation id="778855399387580014">በአዲስ የChrome ትር ውስጥ ፍለጋ ጀምር።</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">ነባሪ - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">አዲስ ፍለጋ</translation>
 <translation id="8328777765163860529">ሁሉንም ዝጋ</translation>
-<translation id="8381750437846184350">Google ፍለጋን፣ ማስታወቂያዎችን እና ሌሎች የGoogle አገልግሎቶችን ግላዊነት ለማላበስ ብሎ የአሰሳ ታሪክዎን እንዴት እንደሚጠቀምበት ይቆጣጠሩት</translation>
 <translation id="8407669440184693619">ለዚህ ጣቢያ ምንም የይለፍ ቃላት አልተገኙም</translation>
 <translation id="842017693807136194">በሚከተለው በመለያ ተገብቷል፦</translation>
 <translation id="8428045167754449968">ከተማ / መለስተኛ ከተማ</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">የብልሽት ሪፖርት ተልኳል።</translation>
 <translation id="952704832371081537">ይቅር</translation>
-<translation id="976982866697960176">የሠመረ ውሂብን ያቀናብሩ…</translation>
 <translation id="988141524645182168">ሌሎች መሣሪያዎች</translation>
 <translation id="989988560359834682">አድራሻ ያርትዑ</translation>
 <translation id="994757059139821576">የጽሑፍ አስተያየት ጥቆማዎች</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index 5a57c7d..9369d750 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">جميع الأوقات</translation>
 <translation id="4338650699862464074">‏إرسال عناوين URL للصفحات التي تزورها إلى Google</translation>
 <translation id="4359125752503270327">ستفتح هذه الصفحة في تطبيق آخر.</translation>
-<translation id="4370827530403103842">المزامنة لا تعمل. انقر للإصلاح.</translation>
 <translation id="4375040482473363939">البحث عن رمز الاستجابة السريعة</translation>
 <translation id="4378154925671717803">هاتف</translation>
 <translation id="441868831736628555">إشعار الخصوصية</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">إعدادات المحتوى</translation>
 <translation id="7015203776128479407">لم ينتهِ إعداد المزامنة الأولية. تم إيقاف المزامنة.</translation>
 <translation id="7029809446516969842">كلمات المرور</translation>
-<translation id="7031882061095297553">مزامنة لـ</translation>
 <translation id="7053983685419859001">حظر</translation>
 <translation id="7062545763355031412">قبول الحسابات وتبديلها</translation>
 <translation id="7099761977003084116">علامات التبويب الأخيرة</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">الاسم بالكامل</translation>
 <translation id="7136892417564438900">الكاميرا غير متاحة</translation>
 <translation id="7159472599653637159">طلب موقع ويب متوافق مع الجوّال</translation>
-<translation id="7167621057293532233">أنواع البيانات</translation>
 <translation id="7173114856073700355">فتح الإعدادات</translation>
 <translation id="7189598951263744875">مشاركة...</translation>
 <translation id="7192050974311852563">بدء التسجيل</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">لتصفح الويب بخصوصية تامّة، يمكنك إضافة علامة تبويب جديدة.</translation>
 <translation id="7671141431838911305">تثبيت</translation>
 <translation id="7765158879357617694">نقل</translation>
-<translation id="7769602470925380267">قبول وتسجيل الخروج</translation>
 <translation id="7772032839648071052">تأكيد عبارة المرور</translation>
 <translation id="7781829728241885113">أمس</translation>
 <translation id="778855399387580014">‏يمكنك بدء البحث في علامة تبويب Chrome جديدة.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">التلقائي - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">بحث جديد</translation>
 <translation id="8328777765163860529">إغلاق الكل</translation>
-<translation id="8381750437846184350">‏التحكّم في الطريقة التي تتّبعها Google عند استخدام سجلّ التصفّح لتخصيص البحث والإعلانات وخدمات Google الأخرى</translation>
 <translation id="8407669440184693619">لم يتم العثور على كلمات مرور لهذا الموقع الإلكتروني</translation>
 <translation id="842017693807136194">تم تسجيل الدخول باستخدام</translation>
 <translation id="8428045167754449968">المدينة/البلدة</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">تم إرسال تقرير الأعطال.</translation>
 <translation id="952704832371081537">إلغاء</translation>
-<translation id="976982866697960176">إدارة البيانات المتزامنة...</translation>
 <translation id="988141524645182168">أجهزة أخرى</translation>
 <translation id="989988560359834682">تعديل العنوان</translation>
 <translation id="994757059139821576">اقتراحات المقالات</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
index 70367f7c..eccd460 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">За цялото време</translation>
 <translation id="4338650699862464074">Изпраща до Google URL адресите на посещаваните от вас страници.</translation>
 <translation id="4359125752503270327">Тази страница ще се отвори в друго приложение.</translation>
-<translation id="4370827530403103842">Синхронизирането не работи. Докоснете, за да отстраните проблема.</translation>
 <translation id="4375040482473363939">Търсене по код за бърза реакция</translation>
 <translation id="4378154925671717803">Телефон</translation>
 <translation id="441868831736628555">Съобщение за поверителност</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Настройки за съдържанието</translation>
 <translation id="7015203776128479407">Първоначалното настройване на синхронизирането не бе завършено. Синхронизирането е изключено.</translation>
 <translation id="7029809446516969842">Пароли</translation>
-<translation id="7031882061095297553">Синхронизиране със</translation>
 <translation id="7053983685419859001">Блокиране</translation>
 <translation id="7062545763355031412">Приемане и превключване на профилите</translation>
 <translation id="7099761977003084116">Скорошни раздели</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Име и фамилия</translation>
 <translation id="7136892417564438900">Няма достъп до камерата</translation>
 <translation id="7159472599653637159">Мобилен сайт</translation>
-<translation id="7167621057293532233">Типове данни</translation>
 <translation id="7173114856073700355">Към настройките</translation>
 <translation id="7189598951263744875">Споделяне...</translation>
 <translation id="7192050974311852563">Стартиране на регистрирането</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">За да сърфирате в мрежата частно, добавете нов раздел.</translation>
 <translation id="7671141431838911305">INSTALL</translation>
 <translation id="7765158879357617694">Преместване</translation>
-<translation id="7769602470925380267">Приемане и излизане от профила</translation>
 <translation id="7772032839648071052">Потвърдете пропуска</translation>
 <translation id="7781829728241885113">Вчера</translation>
 <translation id="778855399387580014">Започнете търсене в нов раздел в Chrome.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Стандартно – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Ново търсене</translation>
 <translation id="8328777765163860529">Затваряне на всички</translation>
-<translation id="8381750437846184350">Контролирайте начина, по който използваме историята ви на сърфиране, за да персонализираме търсенето, рекламите и други услуги на Google</translation>
 <translation id="8407669440184693619">Няма намерени пароли за този сайт</translation>
 <translation id="842017693807136194">Влезли сте със:</translation>
 <translation id="8428045167754449968">Град/селище</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Сигналите за сривове са изпратени.</translation>
 <translation id="952704832371081537">Отказ</translation>
-<translation id="976982866697960176">Управление на синхронизираните данни…</translation>
 <translation id="988141524645182168">Други устройства</translation>
 <translation id="989988560359834682">Редактиране на адреса</translation>
 <translation id="994757059139821576">Предложения за статии</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
index 73279f7..8629895 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">সব সময়</translation>
 <translation id="4338650699862464074">আপনার দেখা পৃষ্ঠাগুলির ইউআরএল Google-এ পাঠায়।</translation>
 <translation id="4359125752503270327">এই পৃষ্ঠাটি আরেকটি অ্যাপ্লিকেশানে খুলবে।</translation>
-<translation id="4370827530403103842">সিঙ্ক কাজ করছে না। ঠিক করতে আলতো চাপুন।</translation>
 <translation id="4375040482473363939">QR কোড খুঁজুন</translation>
 <translation id="4378154925671717803">ফোন</translation>
 <translation id="441868831736628555">গোপনীয়তা বিজ্ঞপ্তি</translation>
@@ -430,7 +429,6 @@
 <translation id="7006788746334555276">কন্টেন্ট সেটিংস</translation>
 <translation id="7015203776128479407">সিঙ্কের প্রাথমিক সেট-আপ সম্পূর্ণ হয়নি। সিঙ্ক বন্ধ আছে।</translation>
 <translation id="7029809446516969842">পাসওয়ার্ড</translation>
-<translation id="7031882061095297553">এতে সিঙ্ক করুন</translation>
 <translation id="7053983685419859001">ব্লক করুন</translation>
 <translation id="7062545763355031412">স্বীকার করে অ্যাকাউন্টগুলি সুইচ করুন</translation>
 <translation id="7099761977003084116">সাম্প্রতিক ট্যাব</translation>
@@ -439,7 +437,6 @@
 <translation id="7133798577887235672">সম্পূর্ণ নাম</translation>
 <translation id="7136892417564438900">ক্যামেরা অনুপলব্ধ</translation>
 <translation id="7159472599653637159">মোবাইল সাইটের জন্য অনুরোধ করুন</translation>
-<translation id="7167621057293532233">ডেটা প্রকার</translation>
 <translation id="7173114856073700355">সেটিংস খুলুন</translation>
 <translation id="7189598951263744875">শেয়ার করুন...</translation>
 <translation id="7192050974311852563">লগ করা শুরু করুন</translation>
@@ -472,7 +469,6 @@
 <translation id="766891008101699113">ব্যক্তিগতভাবে ওয়েব ব্রাউজ করতে, একটি নতুন ট্যাব যোগ করুন।</translation>
 <translation id="7671141431838911305">ইনস্টল করুন</translation>
 <translation id="7765158879357617694">সরান</translation>
-<translation id="7769602470925380267">স্বীকার করে সাইন-আউট করুন</translation>
 <translation id="7772032839648071052">পাসফ্রেজ নিশ্চিত করুন</translation>
 <translation id="7781829728241885113">গতকাল</translation>
 <translation id="778855399387580014">নতুন Chrome ট্যাবে সার্চ করা শুরু করুন।</translation>
@@ -507,7 +503,6 @@
 <translation id="8281781826761538115">ডিফল্ট - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">নতুন ট্যাবে সার্চ করুন</translation>
 <translation id="8328777765163860529">সমস্ত বন্ধ করুন</translation>
-<translation id="8381750437846184350">সার্চ, বিজ্ঞাপন এবং অন্যান্য Google পরিষেবা নিজের মতো করতে Google কিভাবে আপনার ব্রাউজিং ইতিহাস ব্যবহার করে তা নিয়ন্ত্রণ করুন</translation>
 <translation id="8407669440184693619">এই সাইটের জন্য কোনও পাসওয়ার্ড পাওয়া যায়নি</translation>
 <translation id="842017693807136194">এটি দিয়ে সাইন-ইন করেছেন</translation>
 <translation id="8428045167754449968">নগর / ছোট শহর</translation>
@@ -562,7 +557,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">ক্র্যাশ রিপোর্ট পাঠানো হয়েছে৷</translation>
 <translation id="952704832371081537">বাতিল করুন</translation>
-<translation id="976982866697960176">সিঙ্ক হওয়া ডেটা পরিচালনা করুন...</translation>
 <translation id="988141524645182168">অন্যান্য ডিভাইস</translation>
 <translation id="989988560359834682">ঠিকানা সম্পাদনা করুন</translation>
 <translation id="994757059139821576">নিবন্ধ সম্পর্কিত প্রস্তাবনা</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
index 3b6c530..db15bab 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Tot el període</translation>
 <translation id="4338650699862464074">Envia a Google els URL de les pàgines que visites.</translation>
 <translation id="4359125752503270327">Aquesta pàgina s'obrirà en una altra aplicació.</translation>
-<translation id="4370827530403103842">La sincronització no funciona. Toqueu per solucionar-ho.</translation>
 <translation id="4375040482473363939">Cerca mitjançant un codi QR</translation>
 <translation id="4378154925671717803">Telèfon</translation>
 <translation id="441868831736628555">Avís de privadesa</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Configuració del contingut</translation>
 <translation id="7015203776128479407">La configuració de la sincronització inicial no ha finalitzat. La sincronització està desactivada.</translation>
 <translation id="7029809446516969842">Contrasenyes</translation>
-<translation id="7031882061095297553">Sincronitza amb</translation>
 <translation id="7053983685419859001">Bloqueja</translation>
 <translation id="7062545763355031412">Accepta i canvia de compte</translation>
 <translation id="7099761977003084116">Pestanyes recents</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Nom complet</translation>
 <translation id="7136892417564438900">La càmera no està disponible</translation>
 <translation id="7159472599653637159">Sol·licita lloc web per a mòbils</translation>
-<translation id="7167621057293532233">Tipus de dades</translation>
 <translation id="7173114856073700355">Obre Configuració</translation>
 <translation id="7189598951263744875">Comparteix...</translation>
 <translation id="7192050974311852563">Inicia el registre</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Per navegar pel web de manera privada, obre una pestanya nova.</translation>
 <translation id="7671141431838911305">INSTAL·LA</translation>
 <translation id="7765158879357617694">Mou</translation>
-<translation id="7769602470925380267">Accepta i tanca la sessió</translation>
 <translation id="7772032839648071052">Confirmeu la frase de contrasenya</translation>
 <translation id="7781829728241885113">Ahir</translation>
 <translation id="778855399387580014">Inicia una cerca en una pestanya nova de Chrome.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Idioma predeterminat: <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Cerca nova</translation>
 <translation id="8328777765163860529">Tanca-ho tot</translation>
-<translation id="8381750437846184350">Controla com Google utilitza l'historial de navegació per personalitzar la Cerca, els anuncis i altres serveis de Google</translation>
 <translation id="8407669440184693619">No s'ha trobat cap contrasenya per a aquest lloc web</translation>
 <translation id="842017693807136194">S'ha iniciat la sessió amb</translation>
 <translation id="8428045167754449968">Ciutat/població</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">L'informe d'error s'ha enviat.</translation>
 <translation id="952704832371081537">Cancel·la</translation>
-<translation id="976982866697960176">Gestiona les dades sincronitzades…</translation>
 <translation id="988141524645182168">Altres dispositius</translation>
 <translation id="989988560359834682">Edita l'adreça</translation>
 <translation id="994757059139821576">Suggeriments d'articles</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
index 82d2af3e..90519b4 100644
--- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Od počátku věků</translation>
 <translation id="4338650699862464074">Odesílá do Googlu adresy URL navštívených stránek.</translation>
 <translation id="4359125752503270327">Tato stránka se otevře v jiné aplikaci.</translation>
-<translation id="4370827530403103842">Synchronizace nefunguje. Problém odstraníte klepnutím.</translation>
 <translation id="4375040482473363939">Hledání QR kódu</translation>
 <translation id="4378154925671717803">Telefon</translation>
 <translation id="441868831736628555">Oznámení o ochraně soukromí</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Nastavení obsahu</translation>
 <translation id="7015203776128479407">Počáteční nastavení synchronizace nebylo dokončeno. Synchronizace je vypnutá.</translation>
 <translation id="7029809446516969842">Hesla</translation>
-<translation id="7031882061095297553">Synchronizace s účty</translation>
 <translation id="7053983685419859001">Blokovat</translation>
 <translation id="7062545763355031412">Přijmout a přepnout účet</translation>
 <translation id="7099761977003084116">Nedávno použité karty</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Celé jméno</translation>
 <translation id="7136892417564438900">Kamera je nedostupná</translation>
 <translation id="7159472599653637159">Vyžádat web pro mobily</translation>
-<translation id="7167621057293532233">Typy dat</translation>
 <translation id="7173114856073700355">Otevřít nastavení</translation>
 <translation id="7189598951263744875">Sdílet...</translation>
 <translation id="7192050974311852563">Začít protokolovat</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Chcete-li procházet web v soukromí, přidejte novou kartu.</translation>
 <translation id="7671141431838911305">INSTALOVAT</translation>
 <translation id="7765158879357617694">Přesunout</translation>
-<translation id="7769602470925380267">Přijmout a odhlásit se</translation>
 <translation id="7772032839648071052">Potvrďte heslovou frázi</translation>
 <translation id="7781829728241885113">Včera</translation>
 <translation id="778855399387580014">Spustit vyhledávání na nové kartě Chromu.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Výchozí – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Nové vyhledávání</translation>
 <translation id="8328777765163860529">Zavřít vše</translation>
-<translation id="8381750437846184350">Nastavte, jak má Google využívat vaši historii procházení k personalizaci Vyhledávání, reklam a dalších služeb Google</translation>
 <translation id="8407669440184693619">Pro tento web nebyla nalezena žádná hesla</translation>
 <translation id="842017693807136194">Poskytovatel přihlášení</translation>
 <translation id="8428045167754449968">Město nebo obec</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Zpráva o selhání byla odeslána.</translation>
 <translation id="952704832371081537">Zrušit</translation>
-<translation id="976982866697960176">Správa synchronizovaných dat…</translation>
 <translation id="988141524645182168">Jiná zařízení</translation>
 <translation id="989988560359834682">Upravit adresu</translation>
 <translation id="994757059139821576">Návrhy článků</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb
index 00ba1c06..539b354 100644
--- a/ios/chrome/app/strings/resources/ios_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Altid</translation>
 <translation id="4338650699862464074">Sender webadresser for de sider, du besøger, til Google.</translation>
 <translation id="4359125752503270327">Denne side åbner i en anden app.</translation>
-<translation id="4370827530403103842">Synkronisering fungerer ikke. Tryk for at rette problemet.</translation>
 <translation id="4375040482473363939">Søgning efter QR-kode</translation>
 <translation id="4378154925671717803">Telefon</translation>
 <translation id="441868831736628555">Erklæring om privatliv</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Indstillinger for indhold</translation>
 <translation id="7015203776128479407">Den indledende konfiguration af synkronisering blev ikke afsluttet. Synkronisering er deaktiveret.</translation>
 <translation id="7029809446516969842">Adgangskoder</translation>
-<translation id="7031882061095297553">Synkroniser til</translation>
 <translation id="7053983685419859001">Bloker</translation>
 <translation id="7062545763355031412">Acceptér, og skift konto</translation>
 <translation id="7099761977003084116">Seneste faner</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Fulde navn</translation>
 <translation id="7136892417564438900">Kameraet er ikke tilgængeligt</translation>
 <translation id="7159472599653637159">Anmod om mobilversion</translation>
-<translation id="7167621057293532233">Datatyper</translation>
 <translation id="7173114856073700355">Åbn Indstillinger</translation>
 <translation id="7189598951263744875">Del...</translation>
 <translation id="7192050974311852563">Start logføring</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Tilføj en ny fane for at surfe privat på nettet.</translation>
 <translation id="7671141431838911305">INSTALLER</translation>
 <translation id="7765158879357617694">Flyt</translation>
-<translation id="7769602470925380267">Acceptér, og log ud</translation>
 <translation id="7772032839648071052">Bekræft adgangssætning</translation>
 <translation id="7781829728241885113">I går</translation>
 <translation id="778855399387580014">Start en søgning i en ny Chrome-fane.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Standardsprog – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Ny søgning</translation>
 <translation id="8328777765163860529">Luk alt</translation>
-<translation id="8381750437846184350">Administrer, hvordan Google bruger din browserhistorik til at tilpasse Søgning, annoncer og andre Google-tjenester personligt til dig</translation>
 <translation id="8407669440184693619">Der blev ikke fundet nogen adgangskoder til dette website</translation>
 <translation id="842017693807136194">Logget ind med</translation>
 <translation id="8428045167754449968">By</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Der er sendt en nedbrudsrapport.</translation>
 <translation id="952704832371081537">Annuller</translation>
-<translation id="976982866697960176">Administrer synkroniserede data...</translation>
 <translation id="988141524645182168">Andre enheder</translation>
 <translation id="989988560359834682">Rediger adresse</translation>
 <translation id="994757059139821576">Artikelforslag</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb
index 7ff7989..fdb090bf 100644
--- a/ios/chrome/app/strings/resources/ios_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Gesamter Zeitraum</translation>
 <translation id="4338650699862464074">URLs der von Ihnen besuchten Seiten werden an Google gesendet.</translation>
 <translation id="4359125752503270327">Diese Seite wird in einer anderen Anwendung geöffnet.</translation>
-<translation id="4370827530403103842">Synchronisierung funktioniert nicht. Tippen zum Reparieren.</translation>
 <translation id="4375040482473363939">QR-Code-Suche</translation>
 <translation id="4378154925671717803">Telefon</translation>
 <translation id="441868831736628555">Datenschutzhinweise</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Inhaltseinstellungen</translation>
 <translation id="7015203776128479407">Die erstmalige Einrichtung der Synchronisierung wurde nicht abgeschlossen. Synchronisierung ist deaktiviert.</translation>
 <translation id="7029809446516969842">Passwörter</translation>
-<translation id="7031882061095297553">Synchronisieren mit</translation>
 <translation id="7053983685419859001">Blockieren</translation>
 <translation id="7062545763355031412">Akzeptieren und Konto wechseln</translation>
 <translation id="7099761977003084116">Letzte Tabs</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Voller Name</translation>
 <translation id="7136892417564438900">Kamera ist nicht verfügbar</translation>
 <translation id="7159472599653637159">Mobile Version anfordern</translation>
-<translation id="7167621057293532233">Datentypen</translation>
 <translation id="7173114856073700355">Einstellungen öffnen</translation>
 <translation id="7189598951263744875">Teilen...</translation>
 <translation id="7192050974311852563">Protokollierung starten</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Fügen Sie einen neuen Tab hinzu, um privat im Web zu surfen.</translation>
 <translation id="7671141431838911305">Installieren</translation>
 <translation id="7765158879357617694">Verschieben</translation>
-<translation id="7769602470925380267">Akzeptieren und abmelden</translation>
 <translation id="7772032839648071052">Passphrase bestätigen</translation>
 <translation id="7781829728241885113">Gestern</translation>
 <translation id="778855399387580014">Eine Suche in einem neuen Chrome-Tab starten.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Standard: <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Neue Suche</translation>
 <translation id="8328777765163860529">Alle schließen</translation>
-<translation id="8381750437846184350">Festlegen, wie Google Ihren Browserverlauf nutzt, um die Suche, Werbung und andere Google-Dienste zu personalisieren</translation>
 <translation id="8407669440184693619">Keine Passwörter für diese Website gefunden</translation>
 <translation id="842017693807136194">Angemeldet mit</translation>
 <translation id="8428045167754449968">Stadt/Ort</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Absturzbericht wurde gesendet.</translation>
 <translation id="952704832371081537">Abbrechen</translation>
-<translation id="976982866697960176">Synchronisierte Daten verwalten...</translation>
 <translation id="988141524645182168">Andere Geräte</translation>
 <translation id="989988560359834682">Adresse bearbeiten</translation>
 <translation id="994757059139821576">Vorgeschlagene Artikel</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb
index b6e5ced..e87f8ea4 100644
--- a/ios/chrome/app/strings/resources/ios_strings_el.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Από την αρχή</translation>
 <translation id="4338650699862464074">Αποστέλλει στην Google URL των σελίδων που επισκέπτεστε.</translation>
 <translation id="4359125752503270327">Αυτή η σελίδα θα ανοίξει σε άλλη εφαρμογή.</translation>
-<translation id="4370827530403103842">Ο συγχρονισμός δεν λειτουργεί. Πατήστε για επιδιόρθωση.</translation>
 <translation id="4375040482473363939">Αναζήτηση κωδικού QR</translation>
 <translation id="4378154925671717803">Τηλέφωνο</translation>
 <translation id="441868831736628555">Σημείωση απορρήτου</translation>
@@ -430,7 +429,6 @@
 <translation id="7006788746334555276">Ρυθμίσεις περιεχομένου</translation>
 <translation id="7015203776128479407">Η αρχική ρύθμιση του συγχρονισμού δεν τελείωσε. Ο συγχρονισμός είναι απενεργοποιημένος.</translation>
 <translation id="7029809446516969842">Κωδ. πρόσβασης</translation>
-<translation id="7031882061095297553">Συγχρονισμός με</translation>
 <translation id="7053983685419859001">Αποκλεισμός</translation>
 <translation id="7062545763355031412">Αποδοχή και εναλλαγή λογαριασμών</translation>
 <translation id="7099761977003084116">Πρόσφατες καρτέλες</translation>
@@ -439,7 +437,6 @@
 <translation id="7133798577887235672">Ονοματεπώνυμο</translation>
 <translation id="7136892417564438900">Η κάμερα δεν είναι διαθέσιμη</translation>
 <translation id="7159472599653637159">Αίτηση ιστότ. για κινητά</translation>
-<translation id="7167621057293532233">Τύποι δεδομένων</translation>
 <translation id="7173114856073700355">Άνοιγμα ρυθμίσεων</translation>
 <translation id="7189598951263744875">Κοινοποίηση…</translation>
 <translation id="7192050974311852563">Έναρξη καταγραφής</translation>
@@ -472,7 +469,6 @@
 <translation id="766891008101699113">Για να περιηγηθείτε στον ιστό ιδιωτικά, προσθέστε μια νέα καρτέλα.</translation>
 <translation id="7671141431838911305">ΕΓΚΑΤΑΣΤΑΣΗ</translation>
 <translation id="7765158879357617694">Μεταφορά</translation>
-<translation id="7769602470925380267">Αποδοχή και αποσύνδεση</translation>
 <translation id="7772032839648071052">Επιβεβαίωση φράσης πρόσβασης</translation>
 <translation id="7781829728241885113">Χθες</translation>
 <translation id="778855399387580014">Ξεκινήστε μια αναζήτηση σε μια νέα καρτέλα Chrome.</translation>
@@ -507,7 +503,6 @@
 <translation id="8281781826761538115">Προεπιλογή - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Νέα αναζήτηση</translation>
 <translation id="8328777765163860529">Κλείσιμο όλων</translation>
-<translation id="8381750437846184350">Ελέγξτε τον τρόπο με τον οποίο η Google χρησιμοποιεί το ιστορικό περιήγησής σας για την εξατομίκευση της Αναζήτησης, των διαφημίσεων και άλλων υπηρεσιών Google</translation>
 <translation id="8407669440184693619">Δεν βρέθηκαν κωδικοί πρόσβασης για αυτόν τον ιστότοπο</translation>
 <translation id="842017693807136194">Σε σύνδεση με</translation>
 <translation id="8428045167754449968">Πόλη / Κωμόπολη</translation>
@@ -562,7 +557,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Η αναφορά σφάλματος εστάλη.</translation>
 <translation id="952704832371081537">Ακύρωση</translation>
-<translation id="976982866697960176">Διαχείριση συγχρονισμένων δεδομένων…</translation>
 <translation id="988141524645182168">Άλλες συσκευές</translation>
 <translation id="989988560359834682">Επεξεργασία διεύθυνσης</translation>
 <translation id="994757059139821576">Προτάσεις για άρθρα</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 59701ca6..a97346a1 100644
--- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">All time</translation>
 <translation id="4338650699862464074">Sends URLs of pages that you visit to Google.</translation>
 <translation id="4359125752503270327">This page will open in another application.</translation>
-<translation id="4370827530403103842">Sync isn't working. Tap to fix.</translation>
 <translation id="4375040482473363939">QR code Search</translation>
 <translation id="4378154925671717803">Phone</translation>
 <translation id="441868831736628555">Privacy Notice</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Content Settings</translation>
 <translation id="7015203776128479407">Initial sync setup was not finished. Sync is off.</translation>
 <translation id="7029809446516969842">Passwords</translation>
-<translation id="7031882061095297553">Sync to</translation>
 <translation id="7053983685419859001">Block</translation>
 <translation id="7062545763355031412">Accept and switch accounts</translation>
 <translation id="7099761977003084116">Recent Tabs</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Full Name</translation>
 <translation id="7136892417564438900">Camera is unavailable</translation>
 <translation id="7159472599653637159">Request Mobile Site</translation>
-<translation id="7167621057293532233">Data Types</translation>
 <translation id="7173114856073700355">Open Settings</translation>
 <translation id="7189598951263744875">Share...</translation>
 <translation id="7192050974311852563">Start logging</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">To browse the web privately, add a new tab.</translation>
 <translation id="7671141431838911305">INSTALL</translation>
 <translation id="7765158879357617694">Move</translation>
-<translation id="7769602470925380267">Accept and sign out</translation>
 <translation id="7772032839648071052">Confirm passphrase</translation>
 <translation id="7781829728241885113">Yesterday</translation>
 <translation id="778855399387580014">Start a search in a new Chrome tab.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Default - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">New Search</translation>
 <translation id="8328777765163860529">Close All</translation>
-<translation id="8381750437846184350">Control how Google uses your browsing history to personalise Search, ads and other Google services</translation>
 <translation id="8407669440184693619">No passwords found for this site</translation>
 <translation id="842017693807136194">Signed in with</translation>
 <translation id="8428045167754449968">City / Town</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Crash report sent.</translation>
 <translation id="952704832371081537">Cancel</translation>
-<translation id="976982866697960176">Manage Synced Data…</translation>
 <translation id="988141524645182168">Other devices</translation>
 <translation id="989988560359834682">Edit Address</translation>
 <translation id="994757059139821576">Article Suggestions</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 b721148..9d1771f2 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Todo el tiempo</translation>
 <translation id="4338650699862464074">Envía a Google las URL de las páginas que visitas.</translation>
 <translation id="4359125752503270327">Esta página se abrirá en otra aplicación.</translation>
-<translation id="4370827530403103842">La sincronización no funciona. Presiona para corregirla.</translation>
 <translation id="4375040482473363939">Búsqueda mediante código QR</translation>
 <translation id="4378154925671717803">Teléfono</translation>
 <translation id="441868831736628555">Aviso de privacidad</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Configuración de contenido</translation>
 <translation id="7015203776128479407">No se completó la configuración de la sincronización inicial. La sincronización está desactivada.</translation>
 <translation id="7029809446516969842">Contraseñas</translation>
-<translation id="7031882061095297553">Sincronizar con</translation>
 <translation id="7053983685419859001">Bloquear</translation>
 <translation id="7062545763355031412">Aceptar y cambiar de cuenta</translation>
 <translation id="7099761977003084116">Pestañas recientes</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Nombre completo</translation>
 <translation id="7136892417564438900">La cámara no está disponible</translation>
 <translation id="7159472599653637159">Solicitar sitio móvil</translation>
-<translation id="7167621057293532233">Tipos de datos</translation>
 <translation id="7173114856073700355">Abrir la configuración</translation>
 <translation id="7189598951263744875">Compartir...</translation>
 <translation id="7192050974311852563">Iniciar registro</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Para navegar en la Web de manera privada, agrega una pestaña nueva.</translation>
 <translation id="7671141431838911305">INSTALAR</translation>
 <translation id="7765158879357617694">Mover</translation>
-<translation id="7769602470925380267">Aceptar y salir</translation>
 <translation id="7772032839648071052">Confirmar frase de contraseña</translation>
 <translation id="7781829728241885113">Ayer</translation>
 <translation id="778855399387580014">Realiza una búsqueda en una nueva pestaña de Chrome.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Predeterminado: <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Nueva búsqueda</translation>
 <translation id="8328777765163860529">Cerrar todas</translation>
-<translation id="8381750437846184350">Controla la forma en que Google usa tu historial de navegación para personalizar Búsqueda, Ads y otros servicios de Google</translation>
 <translation id="8407669440184693619">No se encontraron contraseñas para este sitio</translation>
 <translation id="842017693807136194">Accediste con</translation>
 <translation id="8428045167754449968">Ciudad/pueblo</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Informe de fallos enviado.</translation>
 <translation id="952704832371081537">Cancelar</translation>
-<translation id="976982866697960176">Administrar datos sincronizados...</translation>
 <translation id="988141524645182168">Otros dispositivos</translation>
 <translation id="989988560359834682">Modificar dirección</translation>
 <translation id="994757059139821576">Sugerencias de artículos</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb
index 23242625..aefbf9ba 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Desde siempre</translation>
 <translation id="4338650699862464074">Envía las URL de las páginas que visitas a Google.</translation>
 <translation id="4359125752503270327">Esta página se abrirá en otra aplicación.</translation>
-<translation id="4370827530403103842">La sincronización no funciona. Toca para solucionarlo.</translation>
 <translation id="4375040482473363939">Búsqueda mediante códigos QR</translation>
 <translation id="4378154925671717803">Teléfono</translation>
 <translation id="441868831736628555">Aviso de privacidad</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Configuración de contenido</translation>
 <translation id="7015203776128479407">La configuración de sincronización inicial no ha terminado. La sincronización está desactivada.</translation>
 <translation id="7029809446516969842">Contraseñas</translation>
-<translation id="7031882061095297553">Sincronizar con</translation>
 <translation id="7053983685419859001">Bloquear</translation>
 <translation id="7062545763355031412">Aceptar y cambiar de cuenta</translation>
 <translation id="7099761977003084116">Pestañas recientes</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Nombre completo</translation>
 <translation id="7136892417564438900">La cámara no está disponible</translation>
 <translation id="7159472599653637159">Solicitar sitio web móvil</translation>
-<translation id="7167621057293532233">Tipos de datos</translation>
 <translation id="7173114856073700355">Abrir Configuración</translation>
 <translation id="7189598951263744875">Compartir...</translation>
 <translation id="7192050974311852563">Iniciar registro</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Para navegar por la Web de forma privada, añade una nueva pestaña.</translation>
 <translation id="7671141431838911305">INSTALAR</translation>
 <translation id="7765158879357617694">Mover</translation>
-<translation id="7769602470925380267">Aceptar y cerrar sesión</translation>
 <translation id="7772032839648071052">Repite la contraseña</translation>
 <translation id="7781829728241885113">Ayer</translation>
 <translation id="778855399387580014">Inicia una búsqueda en una nueva pestaña de Chrome.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Predeterminada: <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Nueva búsqueda</translation>
 <translation id="8328777765163860529">Cerrar todo</translation>
-<translation id="8381750437846184350">Controla cómo utiliza Google tu historial de navegación para personalizar la Búsqueda, los anuncios y otros servicios de Google</translation>
 <translation id="8407669440184693619">No se han encontrado contraseñas para este sitio web</translation>
 <translation id="842017693807136194">Has iniciado sesión como</translation>
 <translation id="8428045167754449968">Ciudad/Localidad</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Informe sobre fallos enviado.</translation>
 <translation id="952704832371081537">Cancelar</translation>
-<translation id="976982866697960176">Administrar datos sincronizados…</translation>
 <translation id="988141524645182168">Otros dispositivos</translation>
 <translation id="989988560359834682">Editar dirección</translation>
 <translation id="994757059139821576">Sugerencias de artículos</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb
index bd9182f..0067595 100644
--- a/ios/chrome/app/strings/resources/ios_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Algusest</translation>
 <translation id="4338650699862464074">Saadab Google'ile teie külastatud lehtede URL-id.</translation>
 <translation id="4359125752503270327">See leht avatakse teises rakenduses.</translation>
-<translation id="4370827530403103842">Sünkroonimine ei tööta. Puudutage parandamiseks.</translation>
 <translation id="4375040482473363939">QR-koodi otsing</translation>
 <translation id="4378154925671717803">Telefon</translation>
 <translation id="441868831736628555">Privaatsusteatis</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Sisu seaded</translation>
 <translation id="7015203776128479407">Sünkroonimise algseadistust ei viidud lõpule. Sünkroonimine on välja lülitatud.</translation>
 <translation id="7029809446516969842">Paroolid</translation>
-<translation id="7031882061095297553">Sünkroonimine:</translation>
 <translation id="7053983685419859001">Blokeeri</translation>
 <translation id="7062545763355031412">Nõustu ja vaheta kontosid</translation>
 <translation id="7099761977003084116">Hiljutised vahelehed</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Täisnimi</translation>
 <translation id="7136892417564438900">Kaamera pole saadaval</translation>
 <translation id="7159472599653637159">Taotle mobiilisaiti</translation>
-<translation id="7167621057293532233">Andmetüübid</translation>
 <translation id="7173114856073700355">Ava seaded</translation>
 <translation id="7189598951263744875">Jaga ...</translation>
 <translation id="7192050974311852563">Alusta logimist</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Privaatselt veebi sirvimiseks lisage uus vaheleht.</translation>
 <translation id="7671141431838911305">INSTALLI</translation>
 <translation id="7765158879357617694">Liiguta</translation>
-<translation id="7769602470925380267">Nõustu ja logi välja</translation>
 <translation id="7772032839648071052">Kinnitage parool</translation>
 <translation id="7781829728241885113">Eile</translation>
 <translation id="778855399387580014">Alustage otsingut uuel Chrome'i vahelehel.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Vaikimisi – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Uus otsing</translation>
 <translation id="8328777765163860529">Sule kõik</translation>
-<translation id="8381750437846184350">Juhtige seda, kuidas Google kasutab teie sirvimisajalugu otsingu, reklaamide ja muude Google'i teenuste isikupärastamiseks</translation>
 <translation id="8407669440184693619">Selle saidi jaoks ei leitud paroole</translation>
 <translation id="842017693807136194">Sisse logitud:</translation>
 <translation id="8428045167754449968">Linn</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Krahhiaruanne on saadetud.</translation>
 <translation id="952704832371081537">Tühista</translation>
-<translation id="976982866697960176">Sünkroonitud andmete haldamine …</translation>
 <translation id="988141524645182168">Muud seadmed</translation>
 <translation id="989988560359834682">Aadressi muutmine</translation>
 <translation id="994757059139821576">Artiklite soovitused</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
index 28390f02..37e674f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">از ابتدا تا الآن</translation>
 <translation id="4338650699862464074">‏نشانی وب صفحه‌هایی را که بازدید می‌کنید برای Google ارسال می‌کند.</translation>
 <translation id="4359125752503270327">این صفحه در برنامه دیگری باز می‌شود.</translation>
-<translation id="4370827530403103842">همگام‌سازی کار نمی‌کند. برای رفع اشکال ضربه بزنید.</translation>
 <translation id="4375040482473363939">‏جستجوی کد QR</translation>
 <translation id="4378154925671717803">تلفن</translation>
 <translation id="441868831736628555">اعلامیه حریم خصوصی</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">تنظیمات محتوا</translation>
 <translation id="7015203776128479407">راه‌اندازی اولیه همگام‌سازی کامل نشد. همگام‌سازی خاموش است.</translation>
 <translation id="7029809446516969842">گذرواژه‌ها</translation>
-<translation id="7031882061095297553">همگام‌سازی در</translation>
 <translation id="7053983685419859001">مسدود کردن</translation>
 <translation id="7062545763355031412">پذیرش و تغییر حساب‌ها</translation>
 <translation id="7099761977003084116">برگه‌های اخیر</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">نام کامل</translation>
 <translation id="7136892417564438900">دوربین غیرقابل‌ دسترسی است</translation>
 <translation id="7159472599653637159">درخواست سایت ویژه دستگاه همراه</translation>
-<translation id="7167621057293532233">انواع داده</translation>
 <translation id="7173114856073700355">باز کردن تنظیمات</translation>
 <translation id="7189598951263744875">در حال اشتراک‌گذاری...</translation>
 <translation id="7192050974311852563">شروع گزارش‌گیری</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">برای مرور وب به‌صورت خصوصی، برگه جدیدی اضافه کنید.</translation>
 <translation id="7671141431838911305">نصب</translation>
 <translation id="7765158879357617694">انتقال</translation>
-<translation id="7769602470925380267">پذیرش و خروج از سیستم</translation>
 <translation id="7772032839648071052">تأیید عبارت عبور</translation>
 <translation id="7781829728241885113">دیروز</translation>
 <translation id="778855399387580014">‏جستجویی در برگه Chrome جدیدی شروع کنید.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">پیش‌فرض - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">جستجوی جدید</translation>
 <translation id="8328777765163860529">بستن همه</translation>
-<translation id="8381750437846184350">‏نحوه استفاده Google را از سابقه مرورتان برای شخصی‌سازی جستجو، آگهی‌ها و سایر سرویس‌های Google کنترل کنید</translation>
 <translation id="8407669440184693619">هیچ گذرواژه‌ای برای این سایت پیدا نشد</translation>
 <translation id="842017693807136194">ورود به سیستم با</translation>
 <translation id="8428045167754449968">شهر / شهرک</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">گزارش خرابی ارسال شد.</translation>
 <translation id="952704832371081537">لغو</translation>
-<translation id="976982866697960176">مدیریت داده‌های همگام‌سازی‌شده…</translation>
 <translation id="988141524645182168">دستگاه‌های دیگر</translation>
 <translation id="989988560359834682">ویرایش آدرس</translation>
 <translation id="994757059139821576">مقالات پیشنهادی</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
index 3f5ab29..c8186049 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Koko historia</translation>
 <translation id="4338650699862464074">Lähettää avaamiesi sivujen URL-osoitteet Googlelle.</translation>
 <translation id="4359125752503270327">Tämä sivu avataan toisessa sovelluksessa.</translation>
-<translation id="4370827530403103842">Synkronointi ei toimi. Korjaa napauttamalla.</translation>
 <translation id="4375040482473363939">QR-koodihaku</translation>
 <translation id="4378154925671717803">Puhelin</translation>
 <translation id="441868831736628555">Tietosuojailmoitus</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Sisältöasetukset</translation>
 <translation id="7015203776128479407">Synkronoinnin ensimääritystä ei tehty loppuun. Synkronointi ei ole käytössä.</translation>
 <translation id="7029809446516969842">Salasanat</translation>
-<translation id="7031882061095297553">Synkronoi tilille</translation>
 <translation id="7053983685419859001">Estä</translation>
 <translation id="7062545763355031412">Hyväksy ja vaihda tiliä</translation>
 <translation id="7099761977003084116">Viimeaikaiset välilehdet</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Koko nimi</translation>
 <translation id="7136892417564438900">Kamera ei ole käytettävissä</translation>
 <translation id="7159472599653637159">Mobiiliversioon</translation>
-<translation id="7167621057293532233">Tietotyypit</translation>
 <translation id="7173114856073700355">Avaa asetukset</translation>
 <translation id="7189598951263744875">Jaa...</translation>
 <translation id="7192050974311852563">Aloita kirjaus</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Jos haluat selata verkkoa yksityisesti, lisää uusi välilehti.</translation>
 <translation id="7671141431838911305">ASENNA</translation>
 <translation id="7765158879357617694">Siirrä</translation>
-<translation id="7769602470925380267">Hyväksy ja kirjaudu ulos</translation>
 <translation id="7772032839648071052">Vahvista tunnuslause</translation>
 <translation id="7781829728241885113">Eilen</translation>
 <translation id="778855399387580014">Aloita haku Chrome-välilehdellä.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Oletus – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Uusi haku</translation>
 <translation id="8328777765163860529">Sulje kaikki</translation>
-<translation id="8381750437846184350">Hallinnoi tapaa, jolla Google käyttää selaushistoriaasi haun, mainosten ja muiden Googlen palveluiden muokkaamiseen.</translation>
 <translation id="8407669440184693619">Tälle sivustolle ei löytynyt salasanoja</translation>
 <translation id="842017693807136194">Kirjauduttu palvelulla</translation>
 <translation id="8428045167754449968">Kaupunki</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Virheraportti lähetettiin.</translation>
 <translation id="952704832371081537">Peruuta</translation>
-<translation id="976982866697960176">Hallinnoi synkronoituja tietoja</translation>
 <translation id="988141524645182168">Muut laitteet</translation>
 <translation id="989988560359834682">Osoitteen muokkaus</translation>
 <translation id="994757059139821576">Ehdotetut artikkelit</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
index 9127b2f..d3224342 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Lahat ng Oras</translation>
 <translation id="4338650699862464074">Magpadala ng mga URL ng mga page na binibisita mo sa Google.</translation>
 <translation id="4359125752503270327">Magbubukas ang page na ito sa ibang application.</translation>
-<translation id="4370827530403103842">Hindi gumagana ang pag-sync. I-tap upang ayusin.</translation>
 <translation id="4375040482473363939">Paghahanap ng QR code</translation>
 <translation id="4378154925671717803">Telepono</translation>
 <translation id="441868831736628555">Notification ng Privacy</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Mga Setting ng Nilalaman</translation>
 <translation id="7015203776128479407">Hindi natapos ang pag-set up ng unang pag-sync. Naka-off ang pag-sync.</translation>
 <translation id="7029809446516969842">Mga Password</translation>
-<translation id="7031882061095297553">I-sync sa</translation>
 <translation id="7053983685419859001">I-block</translation>
 <translation id="7062545763355031412">Tanggapin at lumipat ng account</translation>
 <translation id="7099761977003084116">Mga Kamakailang Tab</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Buong Pangalan</translation>
 <translation id="7136892417564438900">Hindi available ang camera</translation>
 <translation id="7159472599653637159">Hilingin ang Pang-mobile na Site</translation>
-<translation id="7167621057293532233">Mga Uri ng Data</translation>
 <translation id="7173114856073700355">Buksan ang Mga Setting</translation>
 <translation id="7189598951263744875">Ibahagi...</translation>
 <translation id="7192050974311852563">Simulan ang Pag-log</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Para pribadong mag-browse sa web, magdagdag ng bagong tab.</translation>
 <translation id="7671141431838911305">INSTALL</translation>
 <translation id="7765158879357617694">Ilipat</translation>
-<translation id="7769602470925380267">Tanggapin at mag-sign out</translation>
 <translation id="7772032839648071052">Kumpirmahin ang passphrase</translation>
 <translation id="7781829728241885113">Kahapon</translation>
 <translation id="778855399387580014">Start a search in a new Chrome tab.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Default - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Bagong Paghahanap</translation>
 <translation id="8328777765163860529">Isara Lahat</translation>
-<translation id="8381750437846184350">Kontrolin kung paano ginagamit ng Google ang iyong history ng pag-browse para i-personalize ang Search, mga ad, at iba pang serbisyo ng Google</translation>
 <translation id="8407669440184693619">Walang nahanap na password para sa site na ito</translation>
 <translation id="842017693807136194">Naka-sign In Gamit ang</translation>
 <translation id="8428045167754449968">Lungsod / Bayan</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Nagpadala ng ulat sa pag-crash.</translation>
 <translation id="952704832371081537">Kanselahin</translation>
-<translation id="976982866697960176">Pamahalaan ang Naka-sync na Data…</translation>
 <translation id="988141524645182168">Iba Pang Device</translation>
 <translation id="989988560359834682">I-edit ang Address</translation>
 <translation id="994757059139821576">Mga Suhestyong Artikulo</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
index 4ef881ad..660ea82 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Toutes les périodes</translation>
 <translation id="4338650699862464074">Envoie à Google les URL des pages que vous consultez.</translation>
 <translation id="4359125752503270327">Cette page va s'ouvrir dans une autre application.</translation>
-<translation id="4370827530403103842">La synchronisation ne fonctionne pas. Appuyez pour corriger.</translation>
 <translation id="4375040482473363939">Rechercher via un code QR</translation>
 <translation id="4378154925671717803">Téléphone</translation>
 <translation id="441868831736628555">Avis de confidentialité</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Paramètres de contenu</translation>
 <translation id="7015203776128479407">La configuration de la synchronisation initiale n'était pas terminée. La synchronisation est désactivée.</translation>
 <translation id="7029809446516969842">Mots de passe</translation>
-<translation id="7031882061095297553">Synchroniser avec</translation>
 <translation id="7053983685419859001">Bloquer</translation>
 <translation id="7062545763355031412">Accepter et changer de compte</translation>
 <translation id="7099761977003084116">Onglets récents</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Nom complet</translation>
 <translation id="7136892417564438900">Appareil photo non disponible</translation>
 <translation id="7159472599653637159">Voir version mobile</translation>
-<translation id="7167621057293532233">Types de données</translation>
 <translation id="7173114856073700355">Ouvrir les paramètres</translation>
 <translation id="7189598951263744875">Partager…</translation>
 <translation id="7192050974311852563">Démarrer la journalisation</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Pour naviguer sur le Web en toute discrétion, ajoutez un onglet.</translation>
 <translation id="7671141431838911305">INSTALLER</translation>
 <translation id="7765158879357617694">Déplacer</translation>
-<translation id="7769602470925380267">Accepter et se déconnecter</translation>
 <translation id="7772032839648071052">Confirmer la phrase secrète</translation>
 <translation id="7781829728241885113">Hier</translation>
 <translation id="778855399387580014">Lancer une recherche dans un nouvel onglet Chrome.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Par défaut : <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Nouvelle recherche</translation>
 <translation id="8328777765163860529">Tout fermer</translation>
-<translation id="8381750437846184350">Contrôlez la façon dont Google utilise votre historique de navigation pour personnaliser la recherche, les annonces et d'autres services Google.</translation>
 <translation id="8407669440184693619">Aucun mot de passe trouvé pour ce site</translation>
 <translation id="842017693807136194">Connecté avec</translation>
 <translation id="8428045167754449968">Ville</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Le rapport d'erreur a bien été envoyé.</translation>
 <translation id="952704832371081537">Annuler</translation>
-<translation id="976982866697960176">Gérer les données synchronisées…</translation>
 <translation id="988141524645182168">Autres appareils</translation>
 <translation id="989988560359834682">Modifier l'adresse</translation>
 <translation id="994757059139821576">Suggestions d'articles</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
index 0542dff..6df09bd 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">હંમેશાં</translation>
 <translation id="4338650699862464074">તમે મુલાકાત લો તે પેજના URLs Googleને મોકલે છે.</translation>
 <translation id="4359125752503270327">આ પૃષ્ઠ બીજી અ‍ૅપ્લિકેશનમાં ખુલશે.</translation>
-<translation id="4370827530403103842">સમન્વયન કામ કરતું નથી. ઠીક કરવા માટે ટૅપ કરો.</translation>
 <translation id="4375040482473363939">QR કોડ શોધો</translation>
 <translation id="4378154925671717803">ફોન</translation>
 <translation id="441868831736628555">ગોપનીયતા સૂચના</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">કન્ટેન્ટ સેટિંગ</translation>
 <translation id="7015203776128479407">આરંભિક સિંક સેટઅપ પૂરું થયું નથી. સિંક કરવાનું બંધ છે.</translation>
 <translation id="7029809446516969842">પાસવર્ડ્સ</translation>
-<translation id="7031882061095297553">આના પર સમન્વયિત કરો</translation>
 <translation id="7053983685419859001">અવરોધિત કરો</translation>
 <translation id="7062545763355031412">સ્વીકારો અને એકાઉન્ટ્સ સ્વિચ કરો</translation>
 <translation id="7099761977003084116">તાજેતરનાં ટૅબ</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">આખું નામ</translation>
 <translation id="7136892417564438900">કૅમેરો અનુપલબ્ધ છે</translation>
 <translation id="7159472599653637159">મોબાઇલ સાઇટની વિનંતી કરો</translation>
-<translation id="7167621057293532233">ડેટા પ્રકાર</translation>
 <translation id="7173114856073700355">સેટિંગ ખોલો</translation>
 <translation id="7189598951263744875">શેર કરો...</translation>
 <translation id="7192050974311852563">લૉગિંગ શરૂ કરો</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">વેબને ખાનગી રીતે બ્રાઉઝ કરવા માટે, નવી ટૅબ ઉમેરો.</translation>
 <translation id="7671141431838911305">ઇન્સ્ટોલ કરો</translation>
 <translation id="7765158879357617694">સ્થાન</translation>
-<translation id="7769602470925380267">સ્વીકારો અને સાઇન આઉટ કરો</translation>
 <translation id="7772032839648071052">પાસફ્રેઝની પુષ્ટિ કરો</translation>
 <translation id="7781829728241885113">ગઈ કાલે</translation>
 <translation id="778855399387580014">નવા Chrome ટૅબમાં શોધ શરૂ કરો.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">ડિફૉલ્ટ - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">નવી શોધ</translation>
 <translation id="8328777765163860529">બધું બંધ કરો</translation>
-<translation id="8381750437846184350">શોધ, જાહેરાતો અને અન્ય Google સેવાઓને મનગમતી બનાવવા માટે Google, તમારા બ્રાઉઝિંગ ઇતિહાસનો ઉપયોગ કેવી રીતે કરે છે તે નિયંત્રિત કરો</translation>
 <translation id="8407669440184693619">આ સાઇટ માટે કોઈ પાસવર્ડ મળ્યાં નથી</translation>
 <translation id="842017693807136194">ની સાથે સાઇન ઇન કરેલ</translation>
 <translation id="8428045167754449968">શહેર/નગર</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">હેન્ડઓફ</translation>
 <translation id="9223358826628549784">ક્રૅશ રિપોર્ટ મોકલ્યો.</translation>
 <translation id="952704832371081537">રદ કરો</translation>
-<translation id="976982866697960176">સમન્વયિત ડેટા સંચાલિત કરો…</translation>
 <translation id="988141524645182168">અન્ય ઉપકરણો</translation>
 <translation id="989988560359834682">ઍડ્રેસમાં ફેરફાર કરો</translation>
 <translation id="994757059139821576">લેખ માટે સૂચનો</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
index cf20668..61fb3a8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">हमेशा</translation>
 <translation id="4338650699862464074">आप जिन पेजों पर जाते हैं उनके यूआरएल Google को भेजती है</translation>
 <translation id="4359125752503270327">यह पेज किसी अन्य ऐप्लिकेशन में खुलेगा.</translation>
-<translation id="4370827530403103842">समन्वयन काम नहीं कर रहा है. ठीक करने के लिए टैप करें.</translation>
 <translation id="4375040482473363939">QR कोड खोज</translation>
 <translation id="4378154925671717803">फ़ोन</translation>
 <translation id="441868831736628555">निजता सूचना</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">सामग्री सेटिंग</translation>
 <translation id="7015203776128479407">शुरुआती सिंक सेटअप पूरा नहीं हुआ. सिंक बंद है.</translation>
 <translation id="7029809446516969842">पासवर्ड</translation>
-<translation id="7031882061095297553">इसमें समन्वयित करें</translation>
 <translation id="7053983685419859001">ब्लॉक करें</translation>
 <translation id="7062545763355031412">स्वीकार करें और खातों को बदलें</translation>
 <translation id="7099761977003084116">हाल ही के टैब</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">पूरा नाम</translation>
 <translation id="7136892417564438900">कैमरा अनुपलब्ध है</translation>
 <translation id="7159472599653637159">मोबाइल साइट का अनुरोध करें</translation>
-<translation id="7167621057293532233">डेटा प्रकार</translation>
 <translation id="7173114856073700355">सेटिंग खोलें</translation>
 <translation id="7189598951263744875">शेयर करें...</translation>
 <translation id="7192050974311852563">लॉग करना शुरू करें</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">निजी रूप से वेब ब्राउज़ करने के लिए, एक नया टैब जोड़ें.</translation>
 <translation id="7671141431838911305">इंस्टॉल करें</translation>
 <translation id="7765158879357617694">ले जाएं</translation>
-<translation id="7769602470925380267">स्वीकार करें और प्रस्थान करें</translation>
 <translation id="7772032839648071052">'पासफ़्रेज' की पुष्टि करें</translation>
 <translation id="7781829728241885113">बीता कल</translation>
 <translation id="778855399387580014">नए Chrome टैब में खोज शुरू करें.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">डिफ़ॉल्ट - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">नई खोज</translation>
 <translation id="8328777765163860529">सभी बंद करें</translation>
-<translation id="8381750437846184350">नियंत्रित करें कि खोज, विज्ञापन और अन्य Google सेवाओं को मनमुताबिक बनाने के लिए Google आपके ब्राउज़िंग इतिहास का इस्तेमाल कैसे करता है</translation>
 <translation id="8407669440184693619">इस साइट के लिए कोई पासवर्ड नहीं मिला</translation>
 <translation id="842017693807136194">इससे प्रवेश किया गया है</translation>
 <translation id="8428045167754449968">शहर / कस्बा</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">खराबी रिपोर्ट भेज दी गई.</translation>
 <translation id="952704832371081537">रद्द करें</translation>
-<translation id="976982866697960176">सिंक किया गया डेटा प्रबंधित करें...</translation>
 <translation id="988141524645182168">अन्य डिवाइस</translation>
 <translation id="989988560359834682">पते में बदलाव करें</translation>
 <translation id="994757059139821576">लेख के सुझाव</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
index 3421a8f0..b3df7777 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Cijelo vrijeme</translation>
 <translation id="4338650699862464074">Šalje Googleu URL-ove stranica koje posjećujete.</translation>
 <translation id="4359125752503270327">Stranica će se otvoriti u nekoj drugoj aplikaciji.</translation>
-<translation id="4370827530403103842">Sinkronizacija ne radi. Dodirnite za ispravak.</translation>
 <translation id="4375040482473363939">Pretraživanje QR kodova</translation>
 <translation id="4378154925671717803">Telefon</translation>
 <translation id="441868831736628555">Obavijest o privatnosti</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Postavke sadržaja</translation>
 <translation id="7015203776128479407">Početno postavljanje sinkronizacije nije dovršeno. Sinkronizacija je isključena.</translation>
 <translation id="7029809446516969842">Zaporke</translation>
-<translation id="7031882061095297553">Sinkronizacija s računima</translation>
 <translation id="7053983685419859001">Blokiraj</translation>
 <translation id="7062545763355031412">Prihvati i promijeni račun</translation>
 <translation id="7099761977003084116">Nedavne kartice</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Ime i prezime</translation>
 <translation id="7136892417564438900">Fotoaparat nije dostupan</translation>
 <translation id="7159472599653637159">Prikaži mob. str.</translation>
-<translation id="7167621057293532233">Vrste podataka</translation>
 <translation id="7173114856073700355">Otvorite Postavke</translation>
 <translation id="7189598951263744875">Dijeli...</translation>
 <translation id="7192050974311852563">Započni zapisivanje</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Da biste privatno pregledavali web, dodajte novu karticu.</translation>
 <translation id="7671141431838911305">INSTALIRANJE</translation>
 <translation id="7765158879357617694">Pomakni</translation>
-<translation id="7769602470925380267">Prihvati i odjavi se</translation>
 <translation id="7772032839648071052">Potvrdi zaporku</translation>
 <translation id="7781829728241885113">Danas</translation>
 <translation id="778855399387580014">Pokrenite pretraživanje u novoj kartici Chromea.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Zadano – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Novo pretraživanje</translation>
 <translation id="8328777765163860529">Zatvori sve</translation>
-<translation id="8381750437846184350">Upravljajte načinom na koji Google upotrebljava vašu povijest pregledavanja za prilagodbu Pretraživanja, oglasa i drugih Googleovih usluga</translation>
 <translation id="8407669440184693619">Nije pronađena nijedna zaporka za ovu web-lokaciju</translation>
 <translation id="842017693807136194">Prijavljeni ste na uslugu</translation>
 <translation id="8428045167754449968">Grad/mjesto</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Izvješće o rušenju programa poslano je.</translation>
 <translation id="952704832371081537">Odustani</translation>
-<translation id="976982866697960176">Upravljanje sinkroniziranim podacima…</translation>
 <translation id="988141524645182168">Ostali uređaji</translation>
 <translation id="989988560359834682">Uređivanje adrese</translation>
 <translation id="994757059139821576">Predloženi članci</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
index 738e18e..de902cb4 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Mindenkori</translation>
 <translation id="4338650699862464074">Elküldi a felkeresett oldalak URL-címét a Google-nak.</translation>
 <translation id="4359125752503270327">Az oldal egy másik alkalmazásban nyílik meg.</translation>
-<translation id="4370827530403103842">A szinkronizálás nem működik. Koppintson a javításához.</translation>
 <translation id="4375040482473363939">QR-kód keresése</translation>
 <translation id="4378154925671717803">Telefon</translation>
 <translation id="441868831736628555">Adatvédelmi közlemény</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Tartalombeállítások</translation>
 <translation id="7015203776128479407">A szinkronizálás kezdeti beállítása nem fejeződött be. A szinkronizálás ki van kapcsolva.</translation>
 <translation id="7029809446516969842">Jelszavak</translation>
-<translation id="7031882061095297553">Szinkronizálás a következőknél</translation>
 <translation id="7053983685419859001">Letiltás</translation>
 <translation id="7062545763355031412">Elfogadás és fiókváltás</translation>
 <translation id="7099761977003084116">Nemrég megnyitott lapok</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Teljes név</translation>
 <translation id="7136892417564438900">A kamera nem áll rendelkezésre</translation>
 <translation id="7159472599653637159">Mobilwebhely kérése</translation>
-<translation id="7167621057293532233">Adattípusok</translation>
 <translation id="7173114856073700355">Beállítások megnyitása</translation>
 <translation id="7189598951263744875">Megosztás...</translation>
 <translation id="7192050974311852563">Naplózás indítása</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Ha privát módon szeretne böngészni az interneten, adjon hozzá egy új lapot.</translation>
 <translation id="7671141431838911305">TELEPÍTÉS</translation>
 <translation id="7765158879357617694">Áthelyezés</translation>
-<translation id="7769602470925380267">Elfogadás és kijelentkezés</translation>
 <translation id="7772032839648071052">Összetett jelszó megerősítése</translation>
 <translation id="7781829728241885113">Tegnap</translation>
 <translation id="778855399387580014">Keresés indítása új Chrome-lapon.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Alapértelmezett – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Új keresés</translation>
 <translation id="8328777765163860529">Összes bezárása</translation>
-<translation id="8381750437846184350">Annak szabályozása, hogy a Google hogyan használhatja fel az Ön böngészési előzményeit a Keresés, a hirdetések és más Google-szolgáltatások személyre szabására</translation>
 <translation id="8407669440184693619">Nem található jelszó a webhelyhez</translation>
 <translation id="842017693807136194">Bejelentkezve a következővel:</translation>
 <translation id="8428045167754449968">Város/helység</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Átadás</translation>
 <translation id="9223358826628549784">Hibajelentés elküldve.</translation>
 <translation id="952704832371081537">Mégse</translation>
-<translation id="976982866697960176">Szinkronizált adatok kezelése...</translation>
 <translation id="988141524645182168">Egyéb eszközök</translation>
 <translation id="989988560359834682">Cím szerkesztése</translation>
 <translation id="994757059139821576">Javasolt cikkek</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb
index 0ea410a7..74aaae7b6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Semua</translation>
 <translation id="4338650699862464074">Mengirimkan URL halaman yang Anda buka ke Google.</translation>
 <translation id="4359125752503270327">Halaman ini akan dibuka di aplikasi lain.</translation>
-<translation id="4370827530403103842">Sinkronisasi tidak berfungsi. Ketuk untuk memperbaiki.</translation>
 <translation id="4375040482473363939">Telusuri kode QR</translation>
 <translation id="4378154925671717803">Ponsel</translation>
 <translation id="441868831736628555">Notifikasi Privasi</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Setelan Konten</translation>
 <translation id="7015203776128479407">Penyiapan sinkronisasi awal belum selesai. Sinkronisasi nonaktif.</translation>
 <translation id="7029809446516969842">Sandi</translation>
-<translation id="7031882061095297553">Sinkronkan ke</translation>
 <translation id="7053983685419859001">Blokir</translation>
 <translation id="7062545763355031412">Terima dan beralih akun</translation>
 <translation id="7099761977003084116">Tab Terbaru</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Nama Lengkap</translation>
 <translation id="7136892417564438900">Kamera tidak tersedia</translation>
 <translation id="7159472599653637159">Minta Situs Seluler</translation>
-<translation id="7167621057293532233">Jenis Data</translation>
 <translation id="7173114856073700355">Buka Setelan</translation>
 <translation id="7189598951263744875">Bagikan...</translation>
 <translation id="7192050974311852563">Mulai Logging</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Untuk browsing web secara rahasia, tambahkan tab baru.</translation>
 <translation id="7671141431838911305">INSTAL</translation>
 <translation id="7765158879357617694">Pindahkan</translation>
-<translation id="7769602470925380267">Terima dan keluar</translation>
 <translation id="7772032839648071052">Konfirmasi frasa sandi</translation>
 <translation id="7781829728241885113">Kemarin</translation>
 <translation id="778855399387580014">Mulai penelusuran di tab Chrome baru.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Default - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Penelusuran Baru</translation>
 <translation id="8328777765163860529">Tutup Semua</translation>
-<translation id="8381750437846184350">Kontrol cara Google menggunakan histori penjelajahan Anda untuk mempersonalisasi Penelusuran, iklan, dan layanan Google lainnya</translation>
 <translation id="8407669440184693619">Tidak ada sandi yang ditemukan untuk situs ini</translation>
 <translation id="842017693807136194">Login Dengan</translation>
 <translation id="8428045167754449968">Kota</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Laporan kerusakan terkirim.</translation>
 <translation id="952704832371081537">Batal</translation>
-<translation id="976982866697960176">Kelola Data yang Disinkronkan…</translation>
 <translation id="988141524645182168">Perangkat Lainnya</translation>
 <translation id="989988560359834682">Edit Alamat</translation>
 <translation id="994757059139821576">Saran Artikel</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb
index 3dd9cd35..c9a2279 100644
--- a/ios/chrome/app/strings/resources/ios_strings_it.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Dall'inizio</translation>
 <translation id="4338650699862464074">Invia a Google gli URL delle pagine che visiti.</translation>
 <translation id="4359125752503270327">Questa pagina verrà aperta con un'altra applicazione.</translation>
-<translation id="4370827530403103842">La sincronizzazione non funziona. Tocca per risolvere il problema.</translation>
 <translation id="4375040482473363939">Ricerca di codici QR</translation>
 <translation id="4378154925671717803">Telefono</translation>
 <translation id="441868831736628555">Informativa sulla privacy</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Impostazioni contenuti</translation>
 <translation id="7015203776128479407">La configurazione della sincronizzazione iniziale non è stata terminata. La sincronizzazione è disattivata.</translation>
 <translation id="7029809446516969842">Password</translation>
-<translation id="7031882061095297553">Sincronizza con</translation>
 <translation id="7053983685419859001">Blocca</translation>
 <translation id="7062545763355031412">Accetta e cambia account</translation>
 <translation id="7099761977003084116">Schede recenti</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Nome e cognome</translation>
 <translation id="7136892417564438900">La videocamera non è disponibile</translation>
 <translation id="7159472599653637159">Richiedi sito per dispositivi mobili</translation>
-<translation id="7167621057293532233">Tipi di dati</translation>
 <translation id="7173114856073700355">Apri Impostazioni</translation>
 <translation id="7189598951263744875">Condividi...</translation>
 <translation id="7192050974311852563">Avvia logging</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Per navigare sul Web in privato, aggiungi una nuova scheda.</translation>
 <translation id="7671141431838911305">INSTALLA</translation>
 <translation id="7765158879357617694">Sposta</translation>
-<translation id="7769602470925380267">Accetta ed esci</translation>
 <translation id="7772032839648071052">Conferma passphrase</translation>
 <translation id="7781829728241885113">Ieri</translation>
 <translation id="778855399387580014">Avvia una ricerca in una nuova scheda di Chrome.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Predefinita - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Nuova ricerca</translation>
 <translation id="8328777765163860529">Chiudi tutte</translation>
-<translation id="8381750437846184350">Controlla il modo in cui Google utilizza la tua cronologia di navigazione per personalizzare la Ricerca, gli annunci e altri servizi Google.</translation>
 <translation id="8407669440184693619">Non è stata trovata alcuna password per questo sito</translation>
 <translation id="842017693807136194">Accesso eseguito con</translation>
 <translation id="8428045167754449968">Città/località</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Rapporto sugli arresti anomali inviato.</translation>
 <translation id="952704832371081537">Annulla</translation>
-<translation id="976982866697960176">Gestisci dati sincronizzati…</translation>
 <translation id="988141524645182168">Altri dispositivi</translation>
 <translation id="989988560359834682">Modifica indirizzo</translation>
 <translation id="994757059139821576">Suggerimenti di articoli</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
index 0332bc8..1cf386c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">משחר ההיסטוריה</translation>
 <translation id="4338650699862464074">‏שליחת כתובות URL של דפים שנכנסת אליהם אל Google.</translation>
 <translation id="4359125752503270327">הדף הזה ייפתח ביישום אחר.</translation>
-<translation id="4370827530403103842">הסנכרון לא עובד. הקש כאן לתיקון.</translation>
 <translation id="4375040482473363939">‏חיפוש של קוד QR</translation>
 <translation id="4378154925671717803">טלפון</translation>
 <translation id="441868831736628555">הודעת פרטיות</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">הגדרות תוכן</translation>
 <translation id="7015203776128479407">הגדרת הסנכרון הראשונית לא הושלמה. הסנכרון מושבת.</translation>
 <translation id="7029809446516969842">סיסמאות</translation>
-<translation id="7031882061095297553">סינכרון עם</translation>
 <translation id="7053983685419859001">חסימה</translation>
 <translation id="7062545763355031412">קבל והחלף חשבונות</translation>
 <translation id="7099761977003084116">כרטיסיות אחרונות</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">שם מלא</translation>
 <translation id="7136892417564438900">המצלמה לא זמינה</translation>
 <translation id="7159472599653637159">בקש אתר שמותאם לנייד</translation>
-<translation id="7167621057293532233">סוגי נתונים</translation>
 <translation id="7173114856073700355">פתיחת ההגדרות</translation>
 <translation id="7189598951263744875">שיתוף...</translation>
 <translation id="7192050974311852563">התחלת רישום ביומן</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">כדי לגלוש באינטרנט בפרטיות צריך להוסיף כרטיסייה חדשה.</translation>
 <translation id="7671141431838911305">התקנה</translation>
 <translation id="7765158879357617694">העברה</translation>
-<translation id="7769602470925380267">קבל וצא מהחשבון</translation>
 <translation id="7772032839648071052">אשר משפט-סיסמה</translation>
 <translation id="7781829728241885113">אתמול</translation>
 <translation id="778855399387580014">‏חיפוש בכרטיסיית Chrome חדשה.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">ברירת מחדל - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">חיפוש חדש</translation>
 <translation id="8328777765163860529">סגור הכל</translation>
-<translation id="8381750437846184350">‏בידיך השליטה איך Google משתמשת בהיסטוריית הגלישה שלך לצורך התאמה אישית של חיפוש Google, מודעות Google ושירותי Google אחרים</translation>
 <translation id="8407669440184693619">לא נמצאו סיסמאות בשביל האתר הזה</translation>
 <translation id="842017693807136194">מחובר באמצעות</translation>
 <translation id="8428045167754449968">עיר / יישוב</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">דוח הקריסה נשלח.</translation>
 <translation id="952704832371081537">ביטול</translation>
-<translation id="976982866697960176">ניהול נתונים מסונכרנים…</translation>
 <translation id="988141524645182168">מכשירים אחרים</translation>
 <translation id="989988560359834682">ערוך כתובת</translation>
 <translation id="994757059139821576">מאמרים מוצעים</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
index 9eb002c..bd484e8a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">全期間</translation>
 <translation id="4338650699862464074">アクセスしたページの URL を Google に送信します。</translation>
 <translation id="4359125752503270327">このページは別のアプリケーションで開かれます。</translation>
-<translation id="4370827530403103842">同期が機能していません。修正するにはタップしてください。</translation>
 <translation id="4375040482473363939">QR コード検索</translation>
 <translation id="4378154925671717803">電話</translation>
 <translation id="441868831736628555">プライバシーに関するお知らせ</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">コンテンツの設定</translation>
 <translation id="7015203776128479407">最初の同期設定が終了していません。同期は無効です。</translation>
 <translation id="7029809446516969842">パスワード</translation>
-<translation id="7031882061095297553">同期先</translation>
 <translation id="7053983685419859001">ブロック</translation>
 <translation id="7062545763355031412">同意してアカウントを切り替える</translation>
 <translation id="7099761977003084116">最近使ったタブ</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">氏名</translation>
 <translation id="7136892417564438900">カメラを使用できません</translation>
 <translation id="7159472599653637159">モバイルサイトをリクエスト</translation>
-<translation id="7167621057293532233">データの種類</translation>
 <translation id="7173114856073700355">設定を開く</translation>
 <translation id="7189598951263744875">共有...</translation>
 <translation id="7192050974311852563">ログ記録を開始</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">ウェブをプライベートに閲覧するには新しいタブを追加してください。</translation>
 <translation id="7671141431838911305">インストール</translation>
 <translation id="7765158879357617694">移動</translation>
-<translation id="7769602470925380267">同意してログアウトする</translation>
 <translation id="7772032839648071052">パスフレーズの確認</translation>
 <translation id="7781829728241885113">昨日</translation>
 <translation id="778855399387580014">新しい Chrome タブで検索を開始します。</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">デフォルト - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">新しく検索</translation>
 <translation id="8328777765163860529">すべて閉じる</translation>
-<translation id="8381750437846184350">検索、広告、その他の Google サービスをカスタマイズするために Google が閲覧履歴をどのような方法で使用するかを設定します</translation>
 <translation id="8407669440184693619">このサイト用のパスワードが見つかりません</translation>
 <translation id="842017693807136194">ログインに使用した ID プロバイダ</translation>
 <translation id="8428045167754449968">市区町村</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">クラッシュレポートを送信しました。</translation>
 <translation id="952704832371081537">キャンセル</translation>
-<translation id="976982866697960176">同期データを管理...</translation>
 <translation id="988141524645182168">他のデバイス</translation>
 <translation id="989988560359834682">住所の編集</translation>
 <translation id="994757059139821576">記事の候補表示</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
index 8004435..d569c8e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">ಎಲ್ಲ ಸಮಯ</translation>
 <translation id="4338650699862464074">ನೀವು ಭೇಟಿ ನೀಡುವ ಪುಟಗಳ URL ಗಳನ್ನು Google ಗೆ ಕಳುಹಿಸಿ.</translation>
 <translation id="4359125752503270327">ಈ ಪುಟವು ಇನ್ನೊಂದು ಅಪ್ಲಿಕೇಶನ್‌ನಲ್ಲಿ ತೆರೆಯುತ್ತದೆ.</translation>
-<translation id="4370827530403103842">ಸಿಂಕ್ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿಲ್ಲ. ಸರಿಪಡಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ..</translation>
 <translation id="4375040482473363939">QR ಕೋಡ್ ಅನ್ನು ಹುಡುಕಿ</translation>
 <translation id="4378154925671717803">ಫೋನ್</translation>
 <translation id="441868831736628555">ಗೌಪ್ಯತೆಯ ಸೂಚನೆ</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">ವಿಷಯ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
 <translation id="7015203776128479407">ಪ್ರಾರಂಭಿಕ ಸಿಂಕ್ ಸೆಟಪ್ ಮುಗಿದಿಲ್ಲ. ಸಿಂಕ್ ಆಫ್ ಆಗಿದೆ.</translation>
 <translation id="7029809446516969842">ಪಾಸ್‌ವರ್ಡ್‌ಗಳು</translation>
-<translation id="7031882061095297553">ಇದಕ್ಕೆ ಸಿಂಕ್ ಮಾಡಿ</translation>
 <translation id="7053983685419859001">ನಿರ್ಬಂಧಿಸು</translation>
 <translation id="7062545763355031412">ಸಮ್ಮತಿಸಿ ಮತ್ತು ಖಾತೆಗಳನ್ನು ಬದಲಾಯಿಸಿ</translation>
 <translation id="7099761977003084116">ಇತ್ತೀಚಿನ ಟ್ಯಾಬ್‌ಗಳು</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">ಪೂರ್ಣ ಹೆಸರು</translation>
 <translation id="7136892417564438900">ಕ್ಯಾಮರಾ ಲಭ್ಯವಿಲ್ಲ</translation>
 <translation id="7159472599653637159">ಮೊಬೈಲ್ ಸೈಟ್‌ಗೆ ವಿನಂತಿಸಿ</translation>
-<translation id="7167621057293532233">ಡೇಟಾ ವಿಧಾನಗಳು</translation>
 <translation id="7173114856073700355">ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ</translation>
 <translation id="7189598951263744875">ಹಂಚಿ...</translation>
 <translation id="7192050974311852563">ಲಾಗ್‌ ಮಾಡುವುದನ್ನು ಪ್ರಾರಂಭಿಸಿ</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">ವೆಬ್ ಅನ್ನು ಖಾಸಗಿಯಾಗಿ ಬ್ರೌಸ್ ಮಾಡಲು, ಹೊಸ ಟ್ಯಾಬ್ ಸೇರಿಸಿ.</translation>
 <translation id="7671141431838911305">ಇನ್‌ಸ್ಟಾಲ್</translation>
 <translation id="7765158879357617694">ಸರಿಸು</translation>
-<translation id="7769602470925380267">ಸಮ್ಮತಿಸಿ ಮತ್ತು ಸೈನ್ ಔಟ್ ಮಾಡಿ</translation>
 <translation id="7772032839648071052">ಪಾಸ್‌ಫ್ರೇಸ್ ಅನ್ನು ದೃಢೀಕರಿಸಿ</translation>
 <translation id="7781829728241885113">ನಿನ್ನೆ</translation>
 <translation id="778855399387580014">ಹೊಸ Chrome ಟ್ಯಾಬ್‌ನಲ್ಲಿ ಹುಡುಕಾಟವನ್ನು ಪ್ರಾರಂಭಿಸಿ.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">ಡಿಫಾಲ್ಟ್ - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">ಹೊಸ ಹುಡುಕಾಟ</translation>
 <translation id="8328777765163860529">ಎಲ್ಲವನ್ನು ಮುಚ್ಚಿರಿ</translation>
-<translation id="8381750437846184350">ಹುಡುಕಾಟ, ಜಾಹೀರಾತುಗಳು ಮತ್ತು ಇತರ Google ಸೇವೆಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸವನ್ನು Google ಹೇಗೆ ಬಳಸುತ್ತದೆ ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಿ</translation>
 <translation id="8407669440184693619">ಈ ಸೈಟ್‌ಗಾಗಿ ಯಾವುದೇ ಪಾಸ್‌ವರ್ಡ್ ಕಂಡುಬಂದಿಲ್ಲ</translation>
 <translation id="842017693807136194">ಇದರಿಂದ ಸೈನ್‌ ಇನ್‌ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="8428045167754449968">ನಗರ / ಪಟ್ಟಣ</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">ಹ್ಯಾಂಡ್ಆಫ್</translation>
 <translation id="9223358826628549784">ಕ್ರ್ಯಾಶ್ ವರದಿಯನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ.</translation>
 <translation id="952704832371081537">ರದ್ದುಮಾಡಿ</translation>
-<translation id="976982866697960176">ಸಿಂಕ್‌ ಮಾಡಲಾದ ಡೇಟಾವನ್ನು ನಿರ್ವಹಿಸಿ...</translation>
 <translation id="988141524645182168">ಇತರ ಸಾಧನಗಳು</translation>
 <translation id="989988560359834682">ವಿಳಾಸವನ್ನು ಎಡಿಟ್ ಮಾಡಿ</translation>
 <translation id="994757059139821576">ಲೇಖನ ಸಲಹೆಗಳು</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
index 98acbc5..fa4501b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">전체 기간</translation>
 <translation id="4338650699862464074">방문한 페이지의 URL을 Google에 전송합니다.</translation>
 <translation id="4359125752503270327">이 페이지는 다른 애플리케이션에서 열립니다.</translation>
-<translation id="4370827530403103842">동기화가 작동하지 않습니다. 탭하여 수정하세요.</translation>
 <translation id="4375040482473363939">QR 코드 검색</translation>
 <translation id="4378154925671717803">전화기</translation>
 <translation id="441868831736628555">개인정보처리방침</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">콘텐츠 설정</translation>
 <translation id="7015203776128479407">초기 동기화 설정이 완료되지 않았습니다. 동기화가 사용 중지되었습니다.</translation>
 <translation id="7029809446516969842">비밀번호</translation>
-<translation id="7031882061095297553">동기화 가능 계정</translation>
 <translation id="7053983685419859001">차단</translation>
 <translation id="7062545763355031412">동의 및 계정 전환</translation>
 <translation id="7099761977003084116">최근 탭</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">이름</translation>
 <translation id="7136892417564438900">카메라를 사용할 수 없음</translation>
 <translation id="7159472599653637159">모바일 사이트 요청</translation>
-<translation id="7167621057293532233">데이터 유형</translation>
 <translation id="7173114856073700355">설정 열기</translation>
 <translation id="7189598951263744875">공유...</translation>
 <translation id="7192050974311852563">로깅 시작</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">비공개로 웹을 탐색하려면 새 탭을 추가하세요.</translation>
 <translation id="7671141431838911305">설치</translation>
 <translation id="7765158879357617694">이동</translation>
-<translation id="7769602470925380267">동의 및 로그아웃</translation>
 <translation id="7772032839648071052">암호 확인</translation>
 <translation id="7781829728241885113">어제</translation>
 <translation id="778855399387580014">새 Chrome 탭에서 검색을 시작합니다.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">기본값 - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">새 검색</translation>
 <translation id="8328777765163860529">모두 닫기</translation>
-<translation id="8381750437846184350">Google이 검색, 광고 및 다른 Google 서비스를 맞춤설정하기 위하여 내 인터넷 사용 기록을 사용하는 방법을 제어하세요.</translation>
 <translation id="8407669440184693619">이 사이트의 비밀번호를 찾을 수 없음</translation>
 <translation id="842017693807136194">다음을 사용하여 로그인함</translation>
 <translation id="8428045167754449968">시/군/구</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">비정상 종료 보고서 전송 완료</translation>
 <translation id="952704832371081537">취소</translation>
-<translation id="976982866697960176">동기화된 데이터 관리…</translation>
 <translation id="988141524645182168">기타 기기</translation>
 <translation id="989988560359834682">주소 수정</translation>
 <translation id="994757059139821576">기사 추천</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
index 5b79cc92..65cce9b3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Visas laikotarpis</translation>
 <translation id="4338650699862464074">Siunčiami „Google“ puslapių, kuriuose lankotės, URL.</translation>
 <translation id="4359125752503270327">Šis puslapis bus atidarytas kitoje programoje.</translation>
-<translation id="4370827530403103842">Sinchronizavimas neveikia. Palieskite, kad sutvarkytumėte.</translation>
 <translation id="4375040482473363939">QR kodo paieška</translation>
 <translation id="4378154925671717803">Telefonas</translation>
 <translation id="441868831736628555">Privatumo pranešimas</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Turinio nustatymai</translation>
 <translation id="7015203776128479407">Pradinis sinchronizavimo nustatymas nebaigtas. Sinchronizavimas išjungtas.</translation>
 <translation id="7029809446516969842">Slaptažodžiai</translation>
-<translation id="7031882061095297553">Sinchronizavimas su</translation>
 <translation id="7053983685419859001">Blokuoti</translation>
 <translation id="7062545763355031412">Sutikti ir perjungti paskyras</translation>
 <translation id="7099761977003084116">Naujausi skirtukai</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Vardas ir pav.</translation>
 <translation id="7136892417564438900">Fotoaparatas nepasiekiamas</translation>
 <translation id="7159472599653637159">Užkl. dėl svet. v. mobil.</translation>
-<translation id="7167621057293532233">Duomenų tipai</translation>
 <translation id="7173114856073700355">Atidaryti nustatymus</translation>
 <translation id="7189598951263744875">Bendrinti...</translation>
 <translation id="7192050974311852563">Pradėti registravimą</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Norėdami privačiai naršyti žiniatinklyje, pridėkite naują skirtuką.</translation>
 <translation id="7671141431838911305">ĮDIEGTI</translation>
 <translation id="7765158879357617694">Perkelti</translation>
-<translation id="7769602470925380267">Sutikti ir atsijungti</translation>
 <translation id="7772032839648071052">Patvirtinti slaptafrazę</translation>
 <translation id="7781829728241885113">Vakar</translation>
 <translation id="778855399387580014">Pradėti paiešką naujame „Chrome“ skirtuke.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Numatytoji – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Nauja paieška</translation>
 <translation id="8328777765163860529">Uždaryti viską</translation>
-<translation id="8381750437846184350">Valdykite, kaip „Google“ turėtų naudoti jūsų naršymo istoriją, kad suasmenintų Paiešką, skelbimus ir kitas „Google“ paslaugas</translation>
 <translation id="8407669440184693619">Nerasta šios svetainės slaptažodžių</translation>
 <translation id="842017693807136194">Prisijungta naudojant</translation>
 <translation id="8428045167754449968">Didm. / miest.</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Strigties ataskaita išsiųsta.</translation>
 <translation id="952704832371081537">Atšaukti</translation>
-<translation id="976982866697960176">Tvarkyti sinchronizuotus duomenis…</translation>
 <translation id="988141524645182168">Kiti įrenginiai</translation>
 <translation id="989988560359834682">Adreso redagavimas</translation>
 <translation id="994757059139821576">Straipsnių pasiūlymai</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
index d74aee4..e763419 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Viss periods</translation>
 <translation id="4338650699862464074">Nosūta Google serveriem apmeklēto lapu vietrāžus URL.</translation>
 <translation id="4359125752503270327">Šī lapa tiks atvērta citā lietojumprogrammā.</translation>
-<translation id="4370827530403103842">Sinhronizācija nedarbojas. Pieskarieties, lai novērstu problēmu.</translation>
 <translation id="4375040482473363939">Meklēšana ar QR kodu</translation>
 <translation id="4378154925671717803">Tālrunis</translation>
 <translation id="441868831736628555">Konfidencialitātes paziņojums</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Satura iestatījumi</translation>
 <translation id="7015203776128479407">Sākotnējā sinhronizācijas iestatīšana netika pabeigta. Sinhronizācija ir izslēgta.</translation>
 <translation id="7029809446516969842">Paroles</translation>
-<translation id="7031882061095297553">Sinhronizēt ar:</translation>
 <translation id="7053983685419859001">Bloķēt</translation>
 <translation id="7062545763355031412">Piekrist un pārslēgt kontus</translation>
 <translation id="7099761977003084116">Pēdējās cilnes</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Vārds, uzvārds</translation>
 <translation id="7136892417564438900">Kamera nav pieejama.</translation>
 <translation id="7159472599653637159">Pieprasīt mobilo vietni</translation>
-<translation id="7167621057293532233">Datu tipi</translation>
 <translation id="7173114856073700355">Atvērt iestatījumus</translation>
 <translation id="7189598951263744875">Kopīgot...</translation>
 <translation id="7192050974311852563">Sākt reģistrēšanu</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Lai pārlūkotu tīmekli privāti, pievienojiet jaunu cilni.</translation>
 <translation id="7671141431838911305">INSTALĒT</translation>
 <translation id="7765158879357617694">Pārvietot</translation>
-<translation id="7769602470925380267">Piekrist un izrakstīties</translation>
 <translation id="7772032839648071052">Apstipriniet ieejas frāzi</translation>
 <translation id="7781829728241885113">Vakar</translation>
 <translation id="778855399387580014">Meklējiet jaunā Chrome cilnē.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Noklusējuma — <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Jauns meklēšanas vaicājums</translation>
 <translation id="8328777765163860529">Aizvērt visu</translation>
-<translation id="8381750437846184350">Kontrolēt to, kā Google izmanto jūsu pārlūkošanas vēsturi, lai personalizētu Meklēšanu, reklāmas un citus Google pakalpojumus</translation>
 <translation id="8407669440184693619">Šai vietnei nav atrasta neviena parole</translation>
 <translation id="842017693807136194">Pierakstījies kā</translation>
 <translation id="8428045167754449968">Pilsēta/ciems</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Avārijas ziņojums nosūtīts.</translation>
 <translation id="952704832371081537">Atcelt</translation>
-<translation id="976982866697960176">Pārvaldīt sinhronizētos datus…</translation>
 <translation id="988141524645182168">Citas ierīces</translation>
 <translation id="989988560359834682">Rediģēt adresi</translation>
 <translation id="994757059139821576">Rakstu ieteikumi</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
index a2018a1c..be9b85e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">എല്ലാ സമയവും</translation>
 <translation id="4338650699862464074">നിങ്ങൾ സന്ദർശിക്കുന്ന പേജുകളുടെ URL-കൾ Google-ലേക്ക് അയയ്‌ക്കുന്നു.</translation>
 <translation id="4359125752503270327">ഈ പേജ് മറ്റൊരു അപ്ലിക്കേഷനിൽ തുറക്കും.</translation>
-<translation id="4370827530403103842">സമന്വയിപ്പിക്കൽ പ്രവർത്തിക്കുന്നില്ല. പരിഹരിക്കാൻ ടാപ്പുചെയ്യുക.</translation>
 <translation id="4375040482473363939">QR കോഡ് തിരയൽ</translation>
 <translation id="4378154925671717803">ഫോൺ</translation>
 <translation id="441868831736628555">സ്വകാര്യത അറിയിപ്പ്</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">ഉള്ളടക്ക ക്രമീകരണങ്ങള്‍‌</translation>
 <translation id="7015203776128479407">പ്രാഥമിക സമന്വയ സജ്ജീകരണം പൂർത്തിയാക്കിയിട്ടില്ല. സമന്വയം ഓഫാണ്.</translation>
 <translation id="7029809446516969842">പാസ്‌വേഡുകള്‍</translation>
-<translation id="7031882061095297553">ഇതിലേക്ക് സമന്വയിപ്പിക്കുക</translation>
 <translation id="7053983685419859001">തടയുക</translation>
 <translation id="7062545763355031412">അംഗീകരിച്ചശേഷം, അക്കൗണ്ടുകൾ മാറുക</translation>
 <translation id="7099761977003084116">സമീപകാല ടാബുകൾ</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">പൂർണ്ണമായ പേര്</translation>
 <translation id="7136892417564438900">ക്യാമറ ലഭ്യമല്ല</translation>
 <translation id="7159472599653637159">മൊബൈൽ സൈറ്റ് അഭ്യർത്ഥിക്കുക</translation>
-<translation id="7167621057293532233">ഡാറ്റ തരങ്ങള്‍</translation>
 <translation id="7173114856073700355">ക്രമീകരണം തുറക്കുക</translation>
 <translation id="7189598951263744875">പങ്കിടുക...</translation>
 <translation id="7192050974311852563">ലോഗിംഗ് ആരംഭിക്കുക</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">വെബ് സ്വകാര്യമായി ബ്രൗസ് ചെയ്യാൻ, ഒരു പുതിയ ടാബ് ചേർക്കുക.</translation>
 <translation id="7671141431838911305">ഇൻസ്റ്റാളുചെയ്യുക</translation>
 <translation id="7765158879357617694">നീക്കുക</translation>
-<translation id="7769602470925380267">അംഗീകരിച്ചശേഷം, സൈൻ ഔട്ട് ചെയ്യുക</translation>
 <translation id="7772032839648071052">പാസ്ഫ്രേസ് സ്ഥിരീകരിക്കുക</translation>
 <translation id="7781829728241885113">ഇന്നലെ</translation>
 <translation id="778855399387580014">പുതിയ Chrome ടാബിൽ തിരയൽ ആരംഭിക്കുക.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">ഡിഫോൾട്ട് - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">പുതിയ തിരയൽ</translation>
 <translation id="8328777765163860529">എല്ലാം അടയ്‌ക്കുക</translation>
-<translation id="8381750437846184350">തിരയലും പരസ്യങ്ങളും മറ്റ് Google സേവനങ്ങളും വ്യക്തിപരമാക്കാൻ, Google നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം ഉപയോഗിക്കുന്ന രീതി നിയന്ത്രിക്കുക</translation>
 <translation id="8407669440184693619">ഈ സൈറ്റിനുള്ള പാസ്‍വേഡുകളൊന്നും കണ്ടെത്തിയില്ല</translation>
 <translation id="842017693807136194">ഇതുപയോഗിച്ച് സൈൻ ഇൻ ചെയ്‌‌തു</translation>
 <translation id="8428045167754449968">നഗരം / പട്ടണം</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">ഹാൻഡ്ഓഫ്</translation>
 <translation id="9223358826628549784">ക്രാഷ് റിപ്പോർട്ട് അയച്ചു.</translation>
 <translation id="952704832371081537">റദ്ദാക്കുക</translation>
-<translation id="976982866697960176">സമന്വിത ഡാറ്റ മാനേജുചെയ്യുക...</translation>
 <translation id="988141524645182168">മറ്റ് ഉപകരണങ്ങൾ</translation>
 <translation id="989988560359834682">വിലാസം എഡിറ്റുചെയ്യുക</translation>
 <translation id="994757059139821576">ലേഖന നിർദ്ദേശങ്ങൾ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
index 15af2e80..d8c2c1b9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -232,7 +232,6 @@
 <translation id="430967081421617822">सर्व वेळ</translation>
 <translation id="4338650699862464074">तुम्ही भेट दिलेल्या पेजच्या URL Google ला पाठवते.</translation>
 <translation id="4359125752503270327">हे पेज दुसऱ्या ॲप्समध्ये उघडेल.</translation>
-<translation id="4370827530403103842">संकालन कार्य करत नाही. निराकरण करण्यासाठी टॅप करा.</translation>
 <translation id="4375040482473363939">QR कोड शोध</translation>
 <translation id="4378154925671717803">फोन</translation>
 <translation id="441868831736628555">गोपनीयता सूचना</translation>
@@ -427,7 +426,6 @@
 <translation id="7006788746334555276">आशय सेटिंग्ज</translation>
 <translation id="7015203776128479407">सुरुवातीचे सिंक सेट करणे पूर्ण झाले नाही. सिंक बंद आहे.</translation>
 <translation id="7029809446516969842">पासवर्ड</translation>
-<translation id="7031882061095297553">यावर संकालित करा</translation>
 <translation id="7053983685419859001">अवरोधित करा</translation>
 <translation id="7062545763355031412">स्वीकार करा आणि खाती स्विच करा</translation>
 <translation id="7099761977003084116">अलीकडील टॅब</translation>
@@ -436,7 +434,6 @@
 <translation id="7133798577887235672">पूर्ण नाव</translation>
 <translation id="7136892417564438900">कॅमेरा अनुपलब्ध आहे</translation>
 <translation id="7159472599653637159">मोबाइल साइटची विनंती करा</translation>
-<translation id="7167621057293532233">डेटा प्रकार</translation>
 <translation id="7173114856073700355">सेटिंग्ज उघडा</translation>
 <translation id="7189598951263744875">सामयिक करा...</translation>
 <translation id="7192050974311852563">लॉग इन करणे सुरू करा</translation>
@@ -469,7 +466,6 @@
 <translation id="766891008101699113">वेब खाजगीरित्‍या ब्राउझ करण्यासाठी नवीन टॅब जोडा.</translation>
 <translation id="7671141431838911305">स्‍थापित करा</translation>
 <translation id="7765158879357617694">हलवा</translation>
-<translation id="7769602470925380267">स्वीकार करा आणि साइन आउट करा</translation>
 <translation id="7772032839648071052">सांकेतिक पासफ्रेझ निश्चित करा</translation>
 <translation id="7781829728241885113">काल</translation>
 <translation id="778855399387580014">एका नवीन Chrome टॅबमध्ये शोध सुरू करा.</translation>
@@ -504,7 +500,6 @@
 <translation id="8281781826761538115">डीफॉल्ट - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">नवीन शोध</translation>
 <translation id="8328777765163860529">सर्व बंद करा</translation>
-<translation id="8381750437846184350">शोध, जाहिरात आणि इतर Google सेवा पर्सनलाइझ करण्यास Google तुमच्या ब्राउझिंग इतिहासाचा कसा वापर करते ते नियंत्रित करा</translation>
 <translation id="8407669440184693619">या साइटसाठी पासवर्ड सापडले नाहीत</translation>
 <translation id="842017693807136194">यासह साइन इन केले</translation>
 <translation id="8428045167754449968">शहर / नगर</translation>
@@ -559,7 +554,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">क्रॅश अहवाल पाठवला.</translation>
 <translation id="952704832371081537">रद्द करा</translation>
-<translation id="976982866697960176">संकालित केलेला डेटा व्यवस्थापित करा...</translation>
 <translation id="988141524645182168">इतर डिव्हायसेस</translation>
 <translation id="989988560359834682">पत्ता संपादित करा</translation>
 <translation id="994757059139821576">लेख सूचना</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
index a00166e..c2cd391 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Sepanjang Masa</translation>
 <translation id="4338650699862464074">Menghantar URL halaman yang anda lawati kepada Google.</translation>
 <translation id="4359125752503270327">Halaman ini akan dibuka dalam aplikasi lain.</translation>
-<translation id="4370827530403103842">Penyegerakan tidak berfungsi. Ketik untuk membetulkannya.</translation>
 <translation id="4375040482473363939">Carian kod QR</translation>
 <translation id="4378154925671717803">Telefon</translation>
 <translation id="441868831736628555">Notis Privasi</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Tetapan Kandungan</translation>
 <translation id="7015203776128479407">Penyediaan penyegerakan awal tidak diselesaikan. Penyegerakan dimatikan.</translation>
 <translation id="7029809446516969842">Kata laluan</translation>
-<translation id="7031882061095297553">Segerakkan ke</translation>
 <translation id="7053983685419859001">Sekat</translation>
 <translation id="7062545763355031412">Terima dan tukar akaun</translation>
 <translation id="7099761977003084116">Tab Terbaharu</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Nama Penuh</translation>
 <translation id="7136892417564438900">Kamera tidak tersedia</translation>
 <translation id="7159472599653637159">Minta Tapak Mudah Alih</translation>
-<translation id="7167621057293532233">Jenis Data</translation>
 <translation id="7173114856073700355">Buka Tetapan</translation>
 <translation id="7189598951263744875">Kongsi...</translation>
 <translation id="7192050974311852563">Mula Mengelog</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Untuk menyemak imbas web secara sulit, tambahkan tab baharu.</translation>
 <translation id="7671141431838911305">PASANG</translation>
 <translation id="7765158879357617694">Alih</translation>
-<translation id="7769602470925380267">Terima dan log keluar</translation>
 <translation id="7772032839648071052">Sahkan frasa laluan</translation>
 <translation id="7781829728241885113">Semalam</translation>
 <translation id="778855399387580014">Mulakan carian dalam tab Chrome baharu.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Lalai - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Carian Baharu</translation>
 <translation id="8328777765163860529">Tutup Semua</translation>
-<translation id="8381750437846184350">Kawal cara Google menggunakan sejarah penyemakan imbas anda untuk memperibadikan Carian, iklan dan perkhidmatan Google yang lain</translation>
 <translation id="8407669440184693619">Tiada kata laluan ditemui untuk tapak ini</translation>
 <translation id="842017693807136194">Dilog Masuk dengan</translation>
 <translation id="8428045167754449968">Bandar / Pekan</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Serah</translation>
 <translation id="9223358826628549784">Laporan ranap sistem dihantar.</translation>
 <translation id="952704832371081537">Batal</translation>
-<translation id="976982866697960176">Urus Data yang Disegerakkan...</translation>
 <translation id="988141524645182168">Peranti Lain</translation>
 <translation id="989988560359834682">Edit Alamat</translation>
 <translation id="994757059139821576">Cadangan Artikel</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
index a5b8f20..dd06ba5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Altijd</translation>
 <translation id="4338650699862464074">Verzendt de URL's van pagina's die je bezoekt naar Google.</translation>
 <translation id="4359125752503270327">Deze pagina wordt geopend in een andere app.</translation>
-<translation id="4370827530403103842">Synchronisatie werkt niet. Tik om te herstellen.</translation>
 <translation id="4375040482473363939">Zoeken naar QR-code</translation>
 <translation id="4378154925671717803">Telefoon</translation>
 <translation id="441868831736628555">Privacybeleid</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Instellingen voor content</translation>
 <translation id="7015203776128479407">Aanvankelijke synchronisatie-instelling is niet voltooid. Synchronisatie is uitgeschakeld.</translation>
 <translation id="7029809446516969842">Wachtwoorden</translation>
-<translation id="7031882061095297553">Synchroniseren met</translation>
 <translation id="7053983685419859001">Blokkeren</translation>
 <translation id="7062545763355031412">Accepteren en account wijzigen</translation>
 <translation id="7099761977003084116">Recente tabbladen</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Volledige naam</translation>
 <translation id="7136892417564438900">Camera is niet beschikbaar</translation>
 <translation id="7159472599653637159">Mobiele site opvragen</translation>
-<translation id="7167621057293532233">Gegevenstypen</translation>
 <translation id="7173114856073700355">Instellingen openen</translation>
 <translation id="7189598951263744875">Delen</translation>
 <translation id="7192050974311852563">Logboekregistratie starten</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Voeg een nieuw tabblad toe als je privé wilt browsen.</translation>
 <translation id="7671141431838911305">INSTALLEER</translation>
 <translation id="7765158879357617694">Verplaatsen</translation>
-<translation id="7769602470925380267">Accepteren en uitloggen</translation>
 <translation id="7772032839648071052">Bevestig de wachtwoordzin</translation>
 <translation id="7781829728241885113">Gisteren</translation>
 <translation id="778855399387580014">Start een zoekopdracht op een nieuw Chrome-tabblad.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Standaard - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Nieuwe zoekopdracht</translation>
 <translation id="8328777765163860529">Alles sluiten</translation>
-<translation id="8381750437846184350">Beheer hoe Google je browsegeschiedenis gebruikt om Google Zoeken, advertenties en andere Google-services te personaliseren</translation>
 <translation id="8407669440184693619">Geen wachtwoorden gevonden voor deze site</translation>
 <translation id="842017693807136194">Ingelogd met</translation>
 <translation id="8428045167754449968">Stad/plaats</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Crashrapport verzonden.</translation>
 <translation id="952704832371081537">Annuleren</translation>
-<translation id="976982866697960176">Gesynchroniseerde gegevens beheren…</translation>
 <translation id="988141524645182168">Andere apparaten</translation>
 <translation id="989988560359834682">Adres bewerken</translation>
 <translation id="994757059139821576">Artikelsuggesties</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb
index 8f7d184..2c5e4509 100644
--- a/ios/chrome/app/strings/resources/ios_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Alle datoer</translation>
 <translation id="4338650699862464074">Sender Google nettadressene til sider du besøker.</translation>
 <translation id="4359125752503270327">Denne siden åpnes i et annet program.</translation>
-<translation id="4370827530403103842">Synkronisering fungerer ikke. Trykk for å fikse.</translation>
 <translation id="4375040482473363939">QR-kodesøk</translation>
 <translation id="4378154925671717803">Telefon</translation>
 <translation id="441868831736628555">Merknad om personvern</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Innholdsinnstillinger</translation>
 <translation id="7015203776128479407">Innledende synkroniseringsoppsett ble ikke fullført. Synkronisering er slått av.</translation>
 <translation id="7029809446516969842">Passord</translation>
-<translation id="7031882061095297553">Synkroniser med</translation>
 <translation id="7053983685419859001">Blokkér</translation>
 <translation id="7062545763355031412">Godta og bytt konto</translation>
 <translation id="7099761977003084116">Nylige faner</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Fullt navn</translation>
 <translation id="7136892417564438900">Kameraet er utilgjengelig</translation>
 <translation id="7159472599653637159">Be om mobilversjonen av nettstedet</translation>
-<translation id="7167621057293532233">Datatyper</translation>
 <translation id="7173114856073700355">Åpne Innstillinger</translation>
 <translation id="7189598951263744875">Del</translation>
 <translation id="7192050974311852563">Start loggføring</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">For å surfe på nettet privat, legg til en ny fane.</translation>
 <translation id="7671141431838911305">INSTALLER</translation>
 <translation id="7765158879357617694">Flytt</translation>
-<translation id="7769602470925380267">Godta og logg av</translation>
 <translation id="7772032839648071052">Bekreft passord</translation>
 <translation id="7781829728241885113">I går</translation>
 <translation id="778855399387580014">Start et søk i en ny Chrome-fane.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Standard – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Nytt søk</translation>
 <translation id="8328777765163860529">Lukk alle</translation>
-<translation id="8381750437846184350">Kontrollér hvordan Google bruker nettlesingsloggen din for å gi Søk, annonser og andre Google-tjenester et personlig preg</translation>
 <translation id="8407669440184693619">Fant ingen passord for dette nettstedet</translation>
 <translation id="842017693807136194">Logget på med</translation>
 <translation id="8428045167754449968">By/tettsted</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Programstopprapporten er sendt.</translation>
 <translation id="952704832371081537">Avbryt</translation>
-<translation id="976982866697960176">Administrer synkroniserte data …</translation>
 <translation id="988141524645182168">Andre enheter</translation>
 <translation id="989988560359834682">Rediger adresse</translation>
 <translation id="994757059139821576">Artikkelforslag</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
index 82f7f2b..8e871cb 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Od początku</translation>
 <translation id="4338650699862464074">Adresy URL odwiedzanych stron będą wysyłane do Google.</translation>
 <translation id="4359125752503270327">Strona zostanie otwarta w innej aplikacji.</translation>
-<translation id="4370827530403103842">Synchronizacja nie działa. Kliknij, by ją naprawić.</translation>
 <translation id="4375040482473363939">Wyszukiwanie z użyciem kodu QR</translation>
 <translation id="4378154925671717803">Telefon</translation>
 <translation id="441868831736628555">Informacje na temat ochrony prywatności</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Ustawienia treści</translation>
 <translation id="7015203776128479407">Nie ukończono początkowej konfiguracji synchronizacji. Synchronizacja jest wyłączona.</translation>
 <translation id="7029809446516969842">Hasła</translation>
-<translation id="7031882061095297553">Synchronizuj z</translation>
 <translation id="7053983685419859001">Blokuj</translation>
 <translation id="7062545763355031412">Zaakceptuj i przełącz konta</translation>
 <translation id="7099761977003084116">Ostatnie karty</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Imię i nazwisko</translation>
 <translation id="7136892417564438900">Aparat jest niedostępny</translation>
 <translation id="7159472599653637159">Żądaj strony mobilnej</translation>
-<translation id="7167621057293532233">Typy danych</translation>
 <translation id="7173114856073700355">Otwórz Ustawienia</translation>
 <translation id="7189598951263744875">Udostępnij...</translation>
 <translation id="7192050974311852563">Uruchom rejestrowanie</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Aby przeglądać strony internetowe prywatnie, dodaj nową kartę.</translation>
 <translation id="7671141431838911305">ZAINSTALUJ</translation>
 <translation id="7765158879357617694">Przenieś</translation>
-<translation id="7769602470925380267">Zaakceptuj i wyloguj się</translation>
 <translation id="7772032839648071052">Potwierdź hasło</translation>
 <translation id="7781829728241885113">Wczoraj</translation>
 <translation id="778855399387580014">Rozpocznij wyszukiwanie na nowej karcie Chrome.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Domyślny – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Nowe wyszukiwanie</translation>
 <translation id="8328777765163860529">Zamknij wszystkie</translation>
-<translation id="8381750437846184350">Określ, jak Google może korzystać z Twojej historii przeglądania, by dostosowywać wyniki wyszukiwania, reklamy i działanie innych usług</translation>
 <translation id="8407669440184693619">Nie znaleziono haseł do tej strony</translation>
 <translation id="842017693807136194">Zalogowano za pomocą:</translation>
 <translation id="8428045167754449968">Miejscowość</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Raport o awarii został wysłany.</translation>
 <translation id="952704832371081537">Anuluj</translation>
-<translation id="976982866697960176">Zarządzaj synchronizowanymi danymi…</translation>
 <translation id="988141524645182168">Inne urządzenia</translation>
 <translation id="989988560359834682">Edytuj adres</translation>
 <translation id="994757059139821576">Proponowanie artykułów</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 98bb94b..d3e1fd9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Todo o período</translation>
 <translation id="4338650699862464074">Envia URLs das páginas que você visita para o Google.</translation>
 <translation id="4359125752503270327">Esta página será aberta em outro aplicativo.</translation>
-<translation id="4370827530403103842">A sincronização não está funcionando. Toque para corrigir.</translation>
 <translation id="4375040482473363939">Pesquisa por código QR</translation>
 <translation id="4378154925671717803">Telefone</translation>
 <translation id="441868831736628555">Aviso de privacidade</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Configurações de conteúdo</translation>
 <translation id="7015203776128479407">A configuração de sincronização inicial não foi concluída. A sincronização está desativada.</translation>
 <translation id="7029809446516969842">Senhas</translation>
-<translation id="7031882061095297553">Sincronizar com</translation>
 <translation id="7053983685419859001">Bloquear</translation>
 <translation id="7062545763355031412">Aceitar e alternar entre contas</translation>
 <translation id="7099761977003084116">Guias recentes</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Nome completo</translation>
 <translation id="7136892417564438900">A câmera não está disponível</translation>
 <translation id="7159472599653637159">Solicitar um site para dispositivos móveis</translation>
-<translation id="7167621057293532233">Tipos de dados</translation>
 <translation id="7173114856073700355">Abrir "Configurações"</translation>
 <translation id="7189598951263744875">Compartilhar...</translation>
 <translation id="7192050974311852563">Iniciar registro</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Para navegar na Web com privacidade, adicione uma nova guia.</translation>
 <translation id="7671141431838911305">INSTALAR</translation>
 <translation id="7765158879357617694">Mover</translation>
-<translation id="7769602470925380267">Aceitar e sair</translation>
 <translation id="7772032839648071052">Confirmar senha</translation>
 <translation id="7781829728241885113">Ontem</translation>
 <translation id="778855399387580014">Inicie uma pesquisa em uma nova guia do Chrome.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Padrão: <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Nova pesquisa</translation>
 <translation id="8328777765163860529">Fechar todos</translation>
-<translation id="8381750437846184350">Controlar a maneira como o Google usa seu histórico de navegação para personalizar a Pesquisa Google, os anúncios e outros serviços nossos</translation>
 <translation id="8407669440184693619">Nenhuma senha encontrada para este site</translation>
 <translation id="842017693807136194">Conectado com</translation>
 <translation id="8428045167754449968">Cidade</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Transição</translation>
 <translation id="9223358826628549784">Relatórios de erros enviados.</translation>
 <translation id="952704832371081537">Cancelar</translation>
-<translation id="976982866697960176">Gerenciar dados sincronizados…</translation>
 <translation id="988141524645182168">Outros dispositivos</translation>
 <translation id="989988560359834682">Editar endereço</translation>
 <translation id="994757059139821576">Artigos sugeridos</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 89144d49..ae49ce06 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Sempre</translation>
 <translation id="4338650699862464074">Envia para a Google os URLs das páginas que visita.</translation>
 <translation id="4359125752503270327">Esta página abre noutra aplicação.</translation>
-<translation id="4370827530403103842">A sincronização não está a funcionar. Toque para corrigir.</translation>
 <translation id="4375040482473363939">Pesquisa de códigos QR</translation>
 <translation id="4378154925671717803">Telemóvel</translation>
 <translation id="441868831736628555">Aviso de Privacidade</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Definições de Conteúdo</translation>
 <translation id="7015203776128479407">A configuração da sincronização inicial não foi concluída. A sincronização está desativada.</translation>
 <translation id="7029809446516969842">Palavras-passe</translation>
-<translation id="7031882061095297553">Sincronizar com</translation>
 <translation id="7053983685419859001">Bloquear</translation>
 <translation id="7062545763355031412">Aceitar e mudar de contas</translation>
 <translation id="7099761977003084116">Separadores recentes</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Nome completo</translation>
 <translation id="7136892417564438900">A câmara não está disponível</translation>
 <translation id="7159472599653637159">Pedir site para dispositivos móveis</translation>
-<translation id="7167621057293532233">Tipos de dados</translation>
 <translation id="7173114856073700355">Abrir Definições</translation>
 <translation id="7189598951263744875">Partilhar...</translation>
 <translation id="7192050974311852563">Iniciar registo</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Para navegar na Web em privado, adicione um novo separador.</translation>
 <translation id="7671141431838911305">INSTALAR</translation>
 <translation id="7765158879357617694">Mover</translation>
-<translation id="7769602470925380267">Aceitar e terminar sessão</translation>
 <translation id="7772032839648071052">Confirmar frase de acesso</translation>
 <translation id="7781829728241885113">Ontem</translation>
 <translation id="778855399387580014">Inicie uma pesquisa no novo separador do Chrome.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Predefinição – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Nova pesquisa</translation>
 <translation id="8328777765163860529">Fechar Tudo</translation>
-<translation id="8381750437846184350">Controlar a forma como a Google utiliza o seu histórico de navegação para personalizar a Pesquisa Google, os anúncios e outros serviços Google</translation>
 <translation id="8407669440184693619">Não foram encontradas palavras-passe para este site</translation>
 <translation id="842017693807136194">Iniciar sessão com</translation>
 <translation id="8428045167754449968">Cidade/Localidade</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Entrega</translation>
 <translation id="9223358826628549784">Relatório de falha enviado.</translation>
 <translation id="952704832371081537">Cancelar</translation>
-<translation id="976982866697960176">Gerir dados sincronizados...</translation>
 <translation id="988141524645182168">Outros Dispositivos</translation>
 <translation id="989988560359834682">Editar endereço</translation>
 <translation id="994757059139821576">Sugestões de artigos</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
index 95a9617..5f06d19 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Dintotdeauna</translation>
 <translation id="4338650699862464074">Trimite la Google adresele URL ale paginilor pe care le accesezi.</translation>
 <translation id="4359125752503270327">Această pagină se va deschide în altă aplicație.</translation>
-<translation id="4370827530403103842">Sincronizarea nu funcționează. Atinge pentru a o remedia.</translation>
 <translation id="4375040482473363939">Căutare coduri QR</translation>
 <translation id="4378154925671717803">Telefon</translation>
 <translation id="441868831736628555">Notificare de confidențialitate</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Setări privind conținutul</translation>
 <translation id="7015203776128479407">Configurarea inițială a sincronizării nu a fost finalizată. Sincronizarea este dezactivată.</translation>
 <translation id="7029809446516969842">Parole</translation>
-<translation id="7031882061095297553">Sincronizează cu</translation>
 <translation id="7053983685419859001">Blochează</translation>
 <translation id="7062545763355031412">Acceptă și comută conturile</translation>
 <translation id="7099761977003084116">File recente</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Numele complet</translation>
 <translation id="7136892417564438900">Camera foto nu este disponibilă</translation>
 <translation id="7159472599653637159">Site mobil</translation>
-<translation id="7167621057293532233">Tipuri de date</translation>
 <translation id="7173114856073700355">Deschide Setările</translation>
 <translation id="7189598951263744875">Trimite...</translation>
 <translation id="7192050974311852563">Activează înregistrarea în jurnal</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Pentru a răsfoi în privat pe web, adaugă o filă nouă.</translation>
 <translation id="7671141431838911305">INSTALEAZĂ</translation>
 <translation id="7765158879357617694">Mută</translation>
-<translation id="7769602470925380267">Acceptă și deconectează-te</translation>
 <translation id="7772032839648071052">Confirmă expresia de acces</translation>
 <translation id="7781829728241885113">Ieri</translation>
 <translation id="778855399387580014">Începe o căutare într-o filă Chrome nouă.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Prestabilit – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Căutare nouă</translation>
 <translation id="8328777765163860529">Închideți toate</translation>
-<translation id="8381750437846184350">Stabilește cum poate folosi Google istoricul de navigare pentru a personaliza Căutarea, anunțurile și alte servicii Google</translation>
 <translation id="8407669440184693619">Nu s-au găsit parole pentru acest site</translation>
 <translation id="842017693807136194">Conectat(ă) cu</translation>
 <translation id="8428045167754449968">Oraș</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Raportul de blocare a fost trimis.</translation>
 <translation id="952704832371081537">Anulează</translation>
-<translation id="976982866697960176">Gestionează datele sincronizate…</translation>
 <translation id="988141524645182168">Alte dispozitive</translation>
 <translation id="989988560359834682">Editați adresa</translation>
 <translation id="994757059139821576">Sugestii de articole</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
index 2ffd0ab..f5ba492 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Все время</translation>
 <translation id="4338650699862464074">Отправлять URL страниц, которые вы посещаете, в Google.</translation>
 <translation id="4359125752503270327">Страница откроется в другом приложении.</translation>
-<translation id="4370827530403103842">Синхронизация не работает. Нажмите, чтобы исправить.</translation>
 <translation id="4375040482473363939">Поиск по QR-коду</translation>
 <translation id="4378154925671717803">Телефон</translation>
 <translation id="441868831736628555">Примечание о конфиденциальности</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Настройки контента</translation>
 <translation id="7015203776128479407">Первоначальная настройка синхронизации не завершена. Синхронизация выключена.</translation>
 <translation id="7029809446516969842">Пароли</translation>
-<translation id="7031882061095297553">Выберите аккаунт</translation>
 <translation id="7053983685419859001">Блокировать</translation>
 <translation id="7062545763355031412">Принять и переключиться</translation>
 <translation id="7099761977003084116">Недавние вкладки</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Полное имя</translation>
 <translation id="7136892417564438900">Камера недоступна</translation>
 <translation id="7159472599653637159">Мобильная версия</translation>
-<translation id="7167621057293532233">Типы данных</translation>
 <translation id="7173114856073700355">Открыть настройки</translation>
 <translation id="7189598951263744875">Поделиться…</translation>
 <translation id="7192050974311852563">Начать запись журнала</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Чтобы просматривать веб-страницы анонимно, откройте новую вкладку.</translation>
 <translation id="7671141431838911305">УСТАНОВИТЬ</translation>
 <translation id="7765158879357617694">Переместить</translation>
-<translation id="7769602470925380267">Принять и выйти</translation>
 <translation id="7772032839648071052">Подтвердите кодовую фразу</translation>
 <translation id="7781829728241885113">Вчера</translation>
 <translation id="778855399387580014">Запускайте поиск в новой вкладке Chrome.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Язык по умолчанию: <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Новый поиск</translation>
 <translation id="8328777765163860529">Закрыть все</translation>
-<translation id="8381750437846184350">Укажите, как Google может использовать историю браузера для персонализации Поиска, Рекламы и других сервисов.</translation>
 <translation id="8407669440184693619">Паролей для этого сайта не найдено</translation>
 <translation id="842017693807136194">Выполнен вход через</translation>
 <translation id="8428045167754449968">Город</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Отчет отправлен</translation>
 <translation id="952704832371081537">Отмена</translation>
-<translation id="976982866697960176">Управление синхронизированными данными</translation>
 <translation id="988141524645182168">Другие устройства</translation>
 <translation id="989988560359834682">Изменение адреса</translation>
 <translation id="994757059139821576">Рекомендуемые статьи</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
index 46d5ae2..7d22c54 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Za celé obdobie</translation>
 <translation id="4338650699862464074">Odosiela Googlu webové adresy navštívených stránok.</translation>
 <translation id="4359125752503270327">Táto stránka sa otvorí v ďalšej aplikácii.</translation>
-<translation id="4370827530403103842">Synchronizácia nefunguje. Opravte ju klepnutím.</translation>
 <translation id="4375040482473363939">Vyhľadávanie QR kódov</translation>
 <translation id="4378154925671717803">Telefón</translation>
 <translation id="441868831736628555">Oznámenie o ochrane súkromia</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Nastavenia obsahu</translation>
 <translation id="7015203776128479407">Počiatočné nastavenie synchronizácie nebolo dokončené. Synchronizácia je vypnutá.</translation>
 <translation id="7029809446516969842">Heslá</translation>
-<translation id="7031882061095297553">Kam synchronizovať</translation>
 <translation id="7053983685419859001">Blokovať</translation>
 <translation id="7062545763355031412">Prijať a prepnúť účty</translation>
 <translation id="7099761977003084116">Nedávne karty</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Celé meno</translation>
 <translation id="7136892417564438900">Kamera nie je k dispozícii</translation>
 <translation id="7159472599653637159">Vyžiadať stránky pre mobil</translation>
-<translation id="7167621057293532233">Typy údajov</translation>
 <translation id="7173114856073700355">Otvoriť Nastavenia</translation>
 <translation id="7189598951263744875">Zdieľať...</translation>
 <translation id="7192050974311852563">Spustiť zapisovanie do denníka</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Ak chcete internet prehliadať v súkromí, pridajte novú kartu.</translation>
 <translation id="7671141431838911305">INŠTALOVAŤ</translation>
 <translation id="7765158879357617694">Presunúť</translation>
-<translation id="7769602470925380267">Prijať a odhlásiť</translation>
 <translation id="7772032839648071052">Potvrďte prístupovú frázu</translation>
 <translation id="7781829728241885113">Včera</translation>
 <translation id="778855399387580014">Začnite vyhľadávanie na novej karte Chrome.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Predvolené – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Nové vyhľadávanie</translation>
 <translation id="8328777765163860529">Zavrieť všetky</translation>
-<translation id="8381750437846184350">Nastavte, ako má Google používať vašu históriu prehliadania na prispôsobenie Vyhľadávania, reklám a ďalších služieb Googlu</translation>
 <translation id="8407669440184693619">Nenašli sa žiadne heslá tohto webu</translation>
 <translation id="842017693807136194">Prihlásenie pomocou</translation>
 <translation id="8428045167754449968">Mesto</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Správa o zlyhaní bola odoslaná.</translation>
 <translation id="952704832371081537">Zrušiť</translation>
-<translation id="976982866697960176">Spravujte synchronizované údaje…</translation>
 <translation id="988141524645182168">Iné zariadenia</translation>
 <translation id="989988560359834682">Úprava adresy</translation>
 <translation id="994757059139821576">Návrhy článkov</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
index e2510ea..57950802 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Od začetka</translation>
 <translation id="4338650699862464074">Googlu pošlje URL-je strani, ki jih obiščete.</translation>
 <translation id="4359125752503270327">This page will open in another application.</translation>
-<translation id="4370827530403103842">Sync isn't working. Tap to fix.</translation>
 <translation id="4375040482473363939">Iskanje kod QR</translation>
 <translation id="4378154925671717803">Telefon</translation>
 <translation id="441868831736628555">Obvestilo o zasebnosti</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Nastavitve vsebine</translation>
 <translation id="7015203776128479407">Začetna nastavitev sinhronizacije ni bila dokončana. Sinhronizacija je izklopljena.</translation>
 <translation id="7029809446516969842">Gesla</translation>
-<translation id="7031882061095297553">Sinhroniziranje z</translation>
 <translation id="7053983685419859001">Blokiraj</translation>
 <translation id="7062545763355031412">Sprejmi in preklopi račun</translation>
 <translation id="7099761977003084116">Nedavni zavihki</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Polno ime</translation>
 <translation id="7136892417564438900">Fotoaparat ni na voljo</translation>
 <translation id="7159472599653637159">Zahtevaj spletno mesto za mob. napravo</translation>
-<translation id="7167621057293532233">Vrste podatkov</translation>
 <translation id="7173114856073700355">Odpri nastavitve</translation>
 <translation id="7189598951263744875">Deli z drugimi</translation>
 <translation id="7192050974311852563">Začni pisanje dnevnika</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Če želite zasebno brskati po spletu, dodajte nov zavihek.</translation>
 <translation id="7671141431838911305">NAMESTI</translation>
 <translation id="7765158879357617694">Premakni</translation>
-<translation id="7769602470925380267">Sprejem in odjava</translation>
 <translation id="7772032839648071052">Potrdi geslo</translation>
 <translation id="7781829728241885113">Včeraj</translation>
 <translation id="778855399387580014">Začnite iskanje na novem Chromovem zavihku.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Privzeto - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Novo iskanje</translation>
 <translation id="8328777765163860529">Zapri vse</translation>
-<translation id="8381750437846184350">Nadzirajte, kako Google na podlagi vaše zgodovine brskanja prilagaja Iskanje Google, oglase in druge Googlove storitve.</translation>
 <translation id="8407669440184693619">Za to spletno mesto ni najdenih gesel</translation>
 <translation id="842017693807136194">Prijava z/s</translation>
 <translation id="8428045167754449968">Mesto</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Poročilo o zrušitvi poslano.</translation>
 <translation id="952704832371081537">Preklic</translation>
-<translation id="976982866697960176">Upravljanje sinhroniziranih podatkov …</translation>
 <translation id="988141524645182168">Druge naprave</translation>
 <translation id="989988560359834682">Uredi naslov</translation>
 <translation id="994757059139821576">Predlogi za članke</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
index ca49b8e..56b19ba 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Одувек</translation>
 <translation id="4338650699862464074">Шаље URL-ове страница које посећујете Google-у.</translation>
 <translation id="4359125752503270327">Ова страница ће се отворити у другој апликацији.</translation>
-<translation id="4370827530403103842">Синхронизација не функционише. Додирните да бисте решили проблем.</translation>
 <translation id="4375040482473363939">Претрага QR кодова</translation>
 <translation id="4378154925671717803">Телефон</translation>
 <translation id="441868831736628555">Обавештење о приватности</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Подешавања садржаја</translation>
 <translation id="7015203776128479407">Почетно подешавање синхронизације није завршено. Синхронизација је искључена.</translation>
 <translation id="7029809446516969842">Лозинке</translation>
-<translation id="7031882061095297553">Синхронизујте са</translation>
 <translation id="7053983685419859001">Блокирај</translation>
 <translation id="7062545763355031412">Прихватам, промени налог</translation>
 <translation id="7099761977003084116">Недавне картице</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Име и презиме</translation>
 <translation id="7136892417564438900">Камера је недоступна</translation>
 <translation id="7159472599653637159">Захтевај мобилни сајт</translation>
-<translation id="7167621057293532233">Типови података</translation>
 <translation id="7173114856073700355">Отвори Подешавања</translation>
 <translation id="7189598951263744875">Дели...</translation>
 <translation id="7192050974311852563">Покрени евидентирање</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Да бисте приватно прегледали веб, додајте нову картицу.</translation>
 <translation id="7671141431838911305">ИНСТАЛИРАЊЕ</translation>
 <translation id="7765158879357617694">Премести</translation>
-<translation id="7769602470925380267">Прихватам, одјави ме</translation>
 <translation id="7772032839648071052">Потврди приступну фразу</translation>
 <translation id="7781829728241885113">Јуче</translation>
 <translation id="778855399387580014">Започните претрагу на новој Chrome картици.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Подразумевано – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Нова претрага</translation>
 <translation id="8328777765163860529">Затвори све</translation>
-<translation id="8381750437846184350">Контролишите како Google користи историју прегледања за персонализацију Претраге, огласа и других Google услуга</translation>
 <translation id="8407669440184693619">Није пронађена ниједна лозинка за овај сајт</translation>
 <translation id="842017693807136194">Пријављени сте помоћу:</translation>
 <translation id="8428045167754449968">Град/место</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Извештај о отказивању је послат.</translation>
 <translation id="952704832371081537">Откажи</translation>
-<translation id="976982866697960176">Управљајте синхронизованим подацима…</translation>
 <translation id="988141524645182168">Други уређаји</translation>
 <translation id="989988560359834682">Измена адресе</translation>
 <translation id="994757059139821576">Предлози чланака</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
index 450817b7..6aafb7de 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Alltid</translation>
 <translation id="4338650699862464074">Skickar webbadresser till sidor du besöker till Google.</translation>
 <translation id="4359125752503270327">Sidan öppnas i en annan app.</translation>
-<translation id="4370827530403103842">Det går inte att synkronisera. Tryck här för att åtgärda detta.</translation>
 <translation id="4375040482473363939">Sök med QR-koder</translation>
 <translation id="4378154925671717803">Mobil</translation>
 <translation id="441868831736628555">Sekretessmeddelande</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Innehållsinställningar</translation>
 <translation id="7015203776128479407">Den initiala synkroniseringskonfigureringen avslutades inte. Synkroniseringen är inaktiverad.</translation>
 <translation id="7029809446516969842">Lösenord</translation>
-<translation id="7031882061095297553">Synkronisera med</translation>
 <translation id="7053983685419859001">Blockera</translation>
 <translation id="7062545763355031412">Godkänn och byt konto</translation>
 <translation id="7099761977003084116">Senaste flikarna</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Fullständigt namn</translation>
 <translation id="7136892417564438900">Kameran är inte tillgänglig</translation>
 <translation id="7159472599653637159">Använd mobilversion</translation>
-<translation id="7167621057293532233">Datatyper</translation>
 <translation id="7173114856073700355">Inställningar</translation>
 <translation id="7189598951263744875">Dela ...</translation>
 <translation id="7192050974311852563">Starta loggning</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Öppna en ny flik om du vill använda internet privat.</translation>
 <translation id="7671141431838911305">INSTALLERA</translation>
 <translation id="7765158879357617694">Flytta</translation>
-<translation id="7769602470925380267">Godkänn och logga ut</translation>
 <translation id="7772032839648071052">Bekräfta lösenfras</translation>
 <translation id="7781829728241885113">Igår</translation>
 <translation id="778855399387580014">Börja söka på en ny Chrome-flik.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Standard – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Ny sökning</translation>
 <translation id="8328777765163860529">Stäng alla</translation>
-<translation id="8381750437846184350">Styr hur Google anpassar Sök, annonser och andra Google-tjänster utifrån webbhistoriken</translation>
 <translation id="8407669440184693619">Inga lösenord hittades för webbplatsen</translation>
 <translation id="842017693807136194">Inloggad med</translation>
 <translation id="8428045167754449968">Ort</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Felrapporten har skickats.</translation>
 <translation id="952704832371081537">Avbryt</translation>
-<translation id="976982866697960176">Hantera synkroniserad data …</translation>
 <translation id="988141524645182168">Övriga enheter</translation>
 <translation id="989988560359834682">Redigera adress</translation>
 <translation id="994757059139821576">Artikelförslag</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
index a9b8e7a..112b0d1 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Muda Wote</translation>
 <translation id="4338650699862464074">Hutuma URL za kurasa unazotembelea kwa Google.</translation>
 <translation id="4359125752503270327">Ukurasa huu utafunguka katika programu nyingine.</translation>
-<translation id="4370827530403103842">Kipengele cha usawazishaji hakifanyi kazi. Gusa ili urekebishe.</translation>
 <translation id="4375040482473363939">Tafuta msimbo wa QR</translation>
 <translation id="4378154925671717803">Simu</translation>
 <translation id="441868831736628555">Ilani ya Faragha</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Mipangilio ya Maudhui</translation>
 <translation id="7015203776128479407">Haikukamilisha kuweka usawazishaji wa mipangilio ya kwanza. Umezima kipengele cha kusawazisha.</translation>
 <translation id="7029809446516969842">Manenosiri</translation>
-<translation id="7031882061095297553">Sawazisha kwenye</translation>
 <translation id="7053983685419859001">Zuia</translation>
 <translation id="7062545763355031412">Kubali na ubadilishe akaunti</translation>
 <translation id="7099761977003084116">Vichupo vya Hivi Majuzi</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Jina Kamili</translation>
 <translation id="7136892417564438900">Kamera haipatikani</translation>
 <translation id="7159472599653637159">Omba Tovuti ya Kifaa cha Mkononi</translation>
-<translation id="7167621057293532233">Aina za Data</translation>
 <translation id="7173114856073700355">Fungua Mipangilio</translation>
 <translation id="7189598951263744875">Shiriki...</translation>
 <translation id="7192050974311852563">Anza Kuleta Kumbukumbu</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Ili uvinjari kwenye wavuti kwa faragha, ongeza kichupo kipya.</translation>
 <translation id="7671141431838911305">SAKINISHA</translation>
 <translation id="7765158879357617694">Sogeza</translation>
-<translation id="7769602470925380267">Kubali na uondoke kwenye akaunti</translation>
 <translation id="7772032839648071052">Thibitisha kaulisiri</translation>
 <translation id="7781829728241885113">Jana</translation>
 <translation id="778855399387580014">Anza kutafuta ukitumia kichupo kipya cha Chrome.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Chaguomsingi - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Utafutaji Mpya</translation>
 <translation id="8328777765163860529">Funga Vyote</translation>
-<translation id="8381750437846184350">Dhibiti namna Google inavyotumia historia ya kuvinjari ili kuweka mapendeleo kwenye huduma ya Tafuta na Google, matangazo na huduma nyingine za Google.</translation>
 <translation id="8407669440184693619">Hatukupata manenosiri yoyote ya tovuti hii</translation>
 <translation id="842017693807136194">Umeingia katika Akaunti Ukitumia</translation>
 <translation id="8428045167754449968">Jiji / Mji</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Ripoti ya kuacha kufanya kazi imetumwa.</translation>
 <translation id="952704832371081537">Ghairi</translation>
-<translation id="976982866697960176">Dhibiti Data Iliyosawazishwa...</translation>
 <translation id="988141524645182168">Vifaa Vingine</translation>
 <translation id="989988560359834682">Badilisha Anwani</translation>
 <translation id="994757059139821576">Mapendekezo ya Makala</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
index dbef0237..76ea6cd 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">முழுமையும்</translation>
 <translation id="4338650699862464074">நீங்கள் பார்வையிடும் பக்கங்களின் URLகளை Googleளுக்கு அனுப்பும்.</translation>
 <translation id="4359125752503270327">இந்தப் பக்கம் மற்றொரு பயன்பாட்டில் திறக்கப்படும்.</translation>
-<translation id="4370827530403103842">ஒத்திசைவு வேலை செய்யவில்லை. சரிசெய்ய, தட்டவும்.</translation>
 <translation id="4375040482473363939">QR குறியீட்டுத் தேடல்</translation>
 <translation id="4378154925671717803">மொபைல்</translation>
 <translation id="441868831736628555">தனியுரிமை அறிக்கை</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">உள்ளடக்க அமைப்புகள்</translation>
 <translation id="7015203776128479407">ஒத்திசைப்பதற்கான துவக்க அமைவு முடியவில்லை. ஒத்திசைவு முடக்கப்பட்டுள்ளது.</translation>
 <translation id="7029809446516969842">கடவுச்சொற்கள்</translation>
-<translation id="7031882061095297553">இதற்கு ஒத்திசை</translation>
 <translation id="7053983685419859001">தடு</translation>
 <translation id="7062545763355031412">சரி, கணக்குகளை மாற்று</translation>
 <translation id="7099761977003084116">சமீபத்திய தாவல்கள்</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">முழுப் பெயர்</translation>
 <translation id="7136892417564438900">கேமரா இல்லை</translation>
 <translation id="7159472599653637159">மொபைல் தளத்தைக் கோரு</translation>
-<translation id="7167621057293532233">தரவு வகைகள்</translation>
 <translation id="7173114856073700355">ஒத்திசைவு அமைப்புகளைப் பார்க்கவும்</translation>
 <translation id="7189598951263744875">பகிர்...</translation>
 <translation id="7192050974311852563">பதிவுசெய்</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">புதிய தாவலைச் சேர்த்து, தனிப்பட்ட முறையில் இணையத்தை உலாவலாம்.</translation>
 <translation id="7671141431838911305">நிறுவு</translation>
 <translation id="7765158879357617694">நகர்த்து</translation>
-<translation id="7769602470925380267">சரி, வெளியேறு</translation>
 <translation id="7772032839648071052">கடவுச்சொற்றொடரை உறுதி செய்க</translation>
 <translation id="7781829728241885113">நேற்று</translation>
 <translation id="778855399387580014">புதிய Chrome தாவலில் தேடலைத் தொடங்கும்.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">இயல்பு - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">புதிய தேடல்</translation>
 <translation id="8328777765163860529">எல்லாவற்றையும் மூடு</translation>
-<translation id="8381750437846184350">தேடல், விளம்பரங்கள் மற்றும் பிற Google சேவைகளைத் தனிப்பயனாக்க, உங்கள் உலாவல் வரலாற்றை Google எவ்வாறு பயன்படுத்துகிறது என்பதைக் கட்டுப்படுத்துக</translation>
 <translation id="8407669440184693619">இந்தத் தளத்திற்கான கடவுச்சொற்கள் எதுவும் இல்லை</translation>
 <translation id="842017693807136194">இதன் மூலம் உள்நுழைந்துள்ளீர்கள்:</translation>
 <translation id="8428045167754449968">மாநகரம் / நகரம்</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">ஹேண்ட்ஆஃப்</translation>
 <translation id="9223358826628549784">சிதைவு அறிக்கை அனுப்பப்பட்டது.</translation>
 <translation id="952704832371081537">ரத்துசெய்</translation>
-<translation id="976982866697960176">ஒத்திசைத்த தரவை நிர்வகித்தல்...</translation>
 <translation id="988141524645182168">பிற சாதனங்கள்</translation>
 <translation id="989988560359834682">முகவரியைத் திருத்து</translation>
 <translation id="994757059139821576">கட்டுரைப் பரிந்துரைகள்</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb
index ef31360..a98aee0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -232,7 +232,6 @@
 <translation id="430967081421617822">మొత్తం సమయం</translation>
 <translation id="4338650699862464074">మీరు సందర్శించే పేజీల URLలను Googleకు పంపుతుంది.</translation>
 <translation id="4359125752503270327">ఈ పేజీ మరొక అప్లికేషన్‌లో తెరవబడుతుంది.</translation>
-<translation id="4370827530403103842">సమకాలీకరణ పని చేయడం లేదు. పరిష్కరించడానికి నొక్కండి.</translation>
 <translation id="4375040482473363939">QR కోడ్ శోధన</translation>
 <translation id="4378154925671717803">ఫోన్</translation>
 <translation id="441868831736628555">గోప్యతా నోటీసు</translation>
@@ -426,7 +425,6 @@
 <translation id="7006788746334555276">కంటెంట్ సెట్టింగ్‌లు</translation>
 <translation id="7015203776128479407">ప్రాథమిక సింక్ సెటప్ పూర్తి కాలేదు. సింక్ ఆఫ్‌లో ఉంది.</translation>
 <translation id="7029809446516969842">పాస్‌వర్డ్‌లు</translation>
-<translation id="7031882061095297553">వీటికి సమకాలీకరించండి</translation>
 <translation id="7053983685419859001">నిరోధించు</translation>
 <translation id="7062545763355031412">అంగీకరిస్తున్నాను, ఖాతాలను మార్చు</translation>
 <translation id="7099761977003084116">ఇటీవలి ట్యాబ్‌లు</translation>
@@ -435,7 +433,6 @@
 <translation id="7133798577887235672">పూర్తి పేరు</translation>
 <translation id="7136892417564438900">కెమెరా అందుబాటులో లేదు</translation>
 <translation id="7159472599653637159">మొబైల్ సైట్‌ను అభ్యర్థించు</translation>
-<translation id="7167621057293532233">డేటా రకాలు</translation>
 <translation id="7173114856073700355">సెట్టింగ్‌లను తెరువు</translation>
 <translation id="7189598951263744875">భాగస్వామ్యం చేయి...</translation>
 <translation id="7192050974311852563">లాగ్ చేయడం ప్రారంభించు</translation>
@@ -468,7 +465,6 @@
 <translation id="766891008101699113">వెబ్‌ను ప్రైవేట్‌గా బ్రౌజ్ చేయడానికి, కొత్త ట్యాబ్‌ను జోడించండి.</translation>
 <translation id="7671141431838911305">ఇన్‌స్టాల్ చేయి</translation>
 <translation id="7765158879357617694">తరలించు</translation>
-<translation id="7769602470925380267">అంగీకరిస్తున్నాను, సైన్ అవుట్ చేయి</translation>
 <translation id="7772032839648071052">రహస్య పదబంధాన్ని నిర్ధారించండి</translation>
 <translation id="7781829728241885113">నిన్న</translation>
 <translation id="778855399387580014">కొత్త Chrome ట్యాబ్‌లో శోధనను ప్రారంభించండి.</translation>
@@ -503,7 +499,6 @@
 <translation id="8281781826761538115">డిఫాల్ట్ - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">కొత్త శోధన</translation>
 <translation id="8328777765163860529">అన్నింటినీ మూసివేయి</translation>
-<translation id="8381750437846184350">శోధన, ప్రకటనలు మరియు ఇతర Google సేవలను వ్యక్తిగతీకరించడం కోసం Google మీ బ్రౌజింగ్ చరిత్రను ఉపయోగించే విధానాన్ని నియంత్రించండి</translation>
 <translation id="8407669440184693619">ఈ సైట్ కోసం పాస్‌వర్డ్‌లు కనుగొనబడలేదు</translation>
 <translation id="842017693807136194">దీనితో సైన్ ఇన్ చేయబడింది</translation>
 <translation id="8428045167754449968">నగరం / పట్టణం</translation>
@@ -558,7 +553,6 @@
 <translation id="9203116392574189331">హ్యాండ్ఆఫ్</translation>
 <translation id="9223358826628549784">క్రాష్ నివేదిక పంపబడింది.</translation>
 <translation id="952704832371081537">రద్దు చేయి</translation>
-<translation id="976982866697960176">సమకాలీకరించిన డేటాను నిర్వహించండి…</translation>
 <translation id="988141524645182168">ఇతర పరికరాలు</translation>
 <translation id="989988560359834682">చిరునామాను సవరించు</translation>
 <translation id="994757059139821576">కథనం సూచనలు</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb
index 47bd2fc..899e4c87 100644
--- a/ios/chrome/app/strings/resources/ios_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">ตั้งแต่ต้น</translation>
 <translation id="4338650699862464074">ส่ง URL ของหน้าที่คุณเข้าชมไปยัง Google</translation>
 <translation id="4359125752503270327">หน้านี้จะเปิดในแอปพลิเคชันอื่น</translation>
-<translation id="4370827530403103842">การซิงค์ไม่ทำงาน แตะเพื่อแก้ไข</translation>
 <translation id="4375040482473363939">ค้นหาโค้ด QR</translation>
 <translation id="4378154925671717803">โทรศัพท์</translation>
 <translation id="441868831736628555">ประกาศเกี่ยวกับนโยบายความเป็นส่วนตัว</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">การตั้งค่าเนื้อหา</translation>
 <translation id="7015203776128479407">ตั้งค่าการซิงค์เริ่มต้นไม่สำเร็จ การซิงค์ปิดอยู่</translation>
 <translation id="7029809446516969842">รหัสผ่าน</translation>
-<translation id="7031882061095297553">ซิงค์กับ</translation>
 <translation id="7053983685419859001">บล็อก</translation>
 <translation id="7062545763355031412">ยอมรับและเปลี่ยนบัญชี</translation>
 <translation id="7099761977003084116">แท็บล่าสุด</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">ชื่อและนามสกุล</translation>
 <translation id="7136892417564438900">กล้องถ่ายรูปไม่พร้อมใช้งาน</translation>
 <translation id="7159472599653637159">ขอเว็บไซต์สำหรับมือถือ</translation>
-<translation id="7167621057293532233">ประเภทข้อมูล</translation>
 <translation id="7173114856073700355">เปิดการตั้งค่า</translation>
 <translation id="7189598951263744875">แชร์...</translation>
 <translation id="7192050974311852563">เริ่มต้นการบันทึก</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">หากต้องการท่องเว็บแบบเป็นส่วนตัว ให้เพิ่มแท็บใหม่</translation>
 <translation id="7671141431838911305">ติดตั้ง</translation>
 <translation id="7765158879357617694">ย้าย</translation>
-<translation id="7769602470925380267">ยอมรับและออกจากระบบ</translation>
 <translation id="7772032839648071052">ยืนยันข้อความรหัสผ่าน</translation>
 <translation id="7781829728241885113">เมื่อวานนี้</translation>
 <translation id="778855399387580014">เริ่มการค้นหาในแท็บใหม่ของ Chrome</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">ค่าเริ่มต้น - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">ค้นหาใหม่</translation>
 <translation id="8328777765163860529">ปิดทั้งหมด</translation>
-<translation id="8381750437846184350">ควบคุมวิธีที่ Google ใช้ประวัติการท่องเว็บของคุณเพื่อปรับเปลี่ยนการค้นหา โฆษณา และบริการอื่นๆ ของ Google ในแบบของคุณ</translation>
 <translation id="8407669440184693619">ไม่พบรหัสผ่านสำหรับเว็บไซต์นี้</translation>
 <translation id="842017693807136194">ลงชื่อเข้าใช้ด้วย</translation>
 <translation id="8428045167754449968">เมือง/จังหวัด</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">แฮนด์ออฟ</translation>
 <translation id="9223358826628549784">ส่งรายงานข้อขัดข้องแล้ว</translation>
 <translation id="952704832371081537">ยกเลิก</translation>
-<translation id="976982866697960176">จัดการข้อมูลที่ซิงค์…</translation>
 <translation id="988141524645182168">อุปกรณ์อื่นๆ</translation>
 <translation id="989988560359834682">แก้ไขที่อยู่</translation>
 <translation id="994757059139821576">บทความแนะนำ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
index 3263fae..31a7519 100644
--- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Tüm Zamanlar</translation>
 <translation id="4338650699862464074">Ziyaret ettiğiniz sayfaların URL'lerini Google'a gönderir.</translation>
 <translation id="4359125752503270327">Bu sayfa, başka bir uygulamada açılacak.</translation>
-<translation id="4370827530403103842">Senkronizasyon çalışmıyor. Düzeltmek için dokunun.</translation>
 <translation id="4375040482473363939">QR kodu Arama</translation>
 <translation id="4378154925671717803">Telefon</translation>
 <translation id="441868831736628555">Gizlilik Bildirimi</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">İçerik Ayarları</translation>
 <translation id="7015203776128479407">İlk senkronizasyon kurulumu tamamlanmadı. Senkronizasyon kapalı.</translation>
 <translation id="7029809446516969842">Şifreler</translation>
-<translation id="7031882061095297553">Şununla senkronize et</translation>
 <translation id="7053983685419859001">Engelle</translation>
 <translation id="7062545763355031412">Kabul et ve hesabı değiştir</translation>
 <translation id="7099761977003084116">Son Sekmeler</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Tam Ad</translation>
 <translation id="7136892417564438900">Kamera kullanılamıyor</translation>
 <translation id="7159472599653637159">Mobil Site İste</translation>
-<translation id="7167621057293532233">Veri Tipleri</translation>
 <translation id="7173114856073700355">Ayarları Aç</translation>
 <translation id="7189598951263744875">Paylaş...</translation>
 <translation id="7192050974311852563">Günlüğe Kaydetmeyi Başlat</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Web'e gizli modda göz atmak için yeni bir sekme ekleyin.</translation>
 <translation id="7671141431838911305">YÜKLE</translation>
 <translation id="7765158879357617694">Taşı</translation>
-<translation id="7769602470925380267">Kabul et ve oturumu kapat</translation>
 <translation id="7772032839648071052">Parolayı onayla</translation>
 <translation id="7781829728241885113">Dün</translation>
 <translation id="778855399387580014">Yeni bir Chrome sekmesinde arama başlatır.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Varsayılan - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Yeni Arama</translation>
 <translation id="8328777765163860529">Tümünü Kapat</translation>
-<translation id="8381750437846184350">Google'ın Arama, reklamlar ve diğer Google hizmetlerini kişiselleştirmek için tarama geçmişinizi nasıl kullanacağını kontrol edin</translation>
 <translation id="8407669440184693619">Bu site için şifre bulunamadı</translation>
 <translation id="842017693807136194">Şununla Oturum Açıldı:</translation>
 <translation id="8428045167754449968">İl / İlçe</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Kilitlenme raporu gönderildi.</translation>
 <translation id="952704832371081537">İptal</translation>
-<translation id="976982866697960176">Senkronize Edilen Verileri Yönet…</translation>
 <translation id="988141524645182168">Diğer Cihazlar</translation>
 <translation id="989988560359834682">Adresi Düzenle</translation>
 <translation id="994757059139821576">Makale Önerileri</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
index a6058a6..0cf9668 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Увесь час</translation>
 <translation id="4338650699862464074">Надсилає в Google URL-адреси відвіданих сторінок.</translation>
 <translation id="4359125752503270327">Ця сторінка відкриється в іншому додатку.</translation>
-<translation id="4370827530403103842">Синхронізація не працює. Торкніться, щоб виправити.</translation>
 <translation id="4375040482473363939">Шукати за QR-кодом</translation>
 <translation id="4378154925671717803">Телефон</translation>
 <translation id="441868831736628555">Примітка про конфіденційність</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Веб-контент</translation>
 <translation id="7015203776128479407">Початкове налаштування синхронізації не завершено. Синхронізацію вимкнено.</translation>
 <translation id="7029809446516969842">Паролі</translation>
-<translation id="7031882061095297553">Синхронізувати</translation>
 <translation id="7053983685419859001">Блокувати</translation>
 <translation id="7062545763355031412">Прийняти та перейти в інший обліковий запис</translation>
 <translation id="7099761977003084116">Останні вкладки</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Повне ім’я</translation>
 <translation id="7136892417564438900">Камера недоступна</translation>
 <translation id="7159472599653637159">Мобільний сайт</translation>
-<translation id="7167621057293532233">Типи даних</translation>
 <translation id="7173114856073700355">Відкрити налаштування</translation>
 <translation id="7189598951263744875">Поділитися...</translation>
 <translation id="7192050974311852563">Почати ведення журналів</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Щоб переглядати веб-сторінки конфіденційно, додайте нову вкладку.</translation>
 <translation id="7671141431838911305">INSTALL</translation>
 <translation id="7765158879357617694">Перемістити</translation>
-<translation id="7769602470925380267">Прийняти та вийти</translation>
 <translation id="7772032839648071052">Підтвердити парольну фразу</translation>
 <translation id="7781829728241885113">Учора</translation>
 <translation id="778855399387580014">Пошук у новій вкладці Chrome.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">За умовчанням – <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Новий пошук</translation>
 <translation id="8328777765163860529">Закрити всі</translation>
-<translation id="8381750437846184350">Укажіть, як Google має використовувати вашу історію веб-перегляду, щоб персоналізувати Пошук, рекламу та інші служби Google</translation>
 <translation id="8407669440184693619">Немає паролів для цього сайту</translation>
 <translation id="842017693807136194">Ви ввійшли як</translation>
 <translation id="8428045167754449968">Місто</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">Звіт про аварійне завершення роботи надіслано.</translation>
 <translation id="952704832371081537">Скасувати</translation>
-<translation id="976982866697960176">Керування синхронізованими даними…</translation>
 <translation id="988141524645182168">Інші пристрої</translation>
 <translation id="989988560359834682">Редагувати адресу</translation>
 <translation id="994757059139821576">Пропозиції статей</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
index 534ee91..e0f045f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">Từ trước đến nay</translation>
 <translation id="4338650699862464074">Gửi URL của các trang bạn truy cập cho Google.</translation>
 <translation id="4359125752503270327">Trang này sẽ mở trong ứng dụng khác.</translation>
-<translation id="4370827530403103842">Đồng bộ hóa không hoạt động. Nhấn để khắc phục sự cố.</translation>
 <translation id="4375040482473363939">Tìm kiếm mã QR</translation>
 <translation id="4378154925671717803">Điện thoại</translation>
 <translation id="441868831736628555">Thông báo quyền riêng tư</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">Cài đặt nội dung</translation>
 <translation id="7015203776128479407">Quá trình thiết lập đồng bộ hóa ban đầu chưa hoàn tất. Tính năng đồng bộ hóa đã tắt.</translation>
 <translation id="7029809446516969842">Mật khẩu</translation>
-<translation id="7031882061095297553">Đồng bộ hóa với</translation>
 <translation id="7053983685419859001">Chặn</translation>
 <translation id="7062545763355031412">Chấp nhận và chuyển đổi tài khoản</translation>
 <translation id="7099761977003084116">Các tab gần đây</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">Tên đầy đủ</translation>
 <translation id="7136892417564438900">Máy ảnh không khả dụng</translation>
 <translation id="7159472599653637159">Yêu cầu trang web cho di động</translation>
-<translation id="7167621057293532233">Loại dữ liệu</translation>
 <translation id="7173114856073700355">Mở phần Cài đặt</translation>
 <translation id="7189598951263744875">Chia sẻ...</translation>
 <translation id="7192050974311852563">Bắt đầu ghi nhật ký</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">Để duyệt web ở chế độ riêng tư, hãy thêm tab mới.</translation>
 <translation id="7671141431838911305">CÀI ĐẶT</translation>
 <translation id="7765158879357617694">Di chuyển</translation>
-<translation id="7769602470925380267">Chấp nhận và đăng xuất</translation>
 <translation id="7772032839648071052">Xác nhận cụm mật khẩu</translation>
 <translation id="7781829728241885113">Hôm qua</translation>
 <translation id="778855399387580014">Bắt đầu tìm kiếm trong tab Chrome mới.</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">Mặc định - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">Tìm kiếm mới</translation>
 <translation id="8328777765163860529">Đóng tất cả</translation>
-<translation id="8381750437846184350">Kiểm soát cách Google sử dụng lịch sử duyệt web của bạn để cá nhân hóa Tìm kiếm, quảng cáo và các dịch vụ khác của Google</translation>
 <translation id="8407669440184693619">Không tìm thấy mật khẩu nào cho trang web này</translation>
 <translation id="842017693807136194">Đăng nhập bằng</translation>
 <translation id="8428045167754449968">Thành phố/thị trấn</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Tiếp nối</translation>
 <translation id="9223358826628549784">Đã gửi báo cáo lỗi.</translation>
 <translation id="952704832371081537">Hủy</translation>
-<translation id="976982866697960176">Quản lý dữ liệu đã đồng bộ hóa...</translation>
 <translation id="988141524645182168">Thiết bị khác</translation>
 <translation id="989988560359834682">Chỉnh sửa địa chỉ</translation>
 <translation id="994757059139821576">Đề xuất bài viết</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 b3e76a0..1587e43 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">时间不限</translation>
 <translation id="4338650699862464074">将您所访问的网页的网址发送给 Google。</translation>
 <translation id="4359125752503270327">此页面将在其他应用中打开。</translation>
-<translation id="4370827530403103842">同步功能无法正常运行。点按即可修复此问题。</translation>
 <translation id="4375040482473363939">QR 码搜索</translation>
 <translation id="4378154925671717803">电话机</translation>
 <translation id="441868831736628555">隐私权声明</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">内容设置</translation>
 <translation id="7015203776128479407">初始同步设置未完成。同步功能处于关闭状态。</translation>
 <translation id="7029809446516969842">密码</translation>
-<translation id="7031882061095297553">同步到</translation>
 <translation id="7053983685419859001">禁止</translation>
 <translation id="7062545763355031412">接受并切换帐号</translation>
 <translation id="7099761977003084116">最近打开的标签页</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">全称</translation>
 <translation id="7136892417564438900">无法使用相机</translation>
 <translation id="7159472599653637159">请求移动版网站</translation>
-<translation id="7167621057293532233">数据类型</translation>
 <translation id="7173114856073700355">打开“设置”</translation>
 <translation id="7189598951263744875">分享...</translation>
 <translation id="7192050974311852563">开始生成日志</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">要以私密方式浏览网页,请添加新标签页。</translation>
 <translation id="7671141431838911305">安装</translation>
 <translation id="7765158879357617694">移动</translation>
-<translation id="7769602470925380267">接受并退出</translation>
 <translation id="7772032839648071052">确认密码</translation>
 <translation id="7781829728241885113">昨天</translation>
 <translation id="778855399387580014">在新的 Chrome 标签页中发起搜索。</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">默认语言区域 - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">新搜索</translation>
 <translation id="8328777765163860529">全部关闭</translation>
-<translation id="8381750437846184350">控制 Google 如何利用您的浏览记录为您提供个性化的 Google 搜索、广告和其他 Google 服务</translation>
 <translation id="8407669440184693619">未找到任何用于此网站的密码</translation>
 <translation id="842017693807136194">所用登录身份</translation>
 <translation id="8428045167754449968">市/镇</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">已发送崩溃报告。</translation>
 <translation id="952704832371081537">取消</translation>
-<translation id="976982866697960176">管理同步的数据…</translation>
 <translation id="988141524645182168">其他设备</translation>
 <translation id="989988560359834682">修改地址</translation>
 <translation id="994757059139821576">文章推荐</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 c7aa8c0..01bc4e8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -235,7 +235,6 @@
 <translation id="430967081421617822">不限時間</translation>
 <translation id="4338650699862464074">將你造訪的網頁網址傳送給 Google。</translation>
 <translation id="4359125752503270327">這個網頁會在其他應用程式中開啟。</translation>
-<translation id="4370827530403103842">同步處理功能無法正常運作。請輕觸這裡以修正同步問題。</translation>
 <translation id="4375040482473363939">QR 圖碼搜尋</translation>
 <translation id="4378154925671717803">電話</translation>
 <translation id="441868831736628555">隱私權聲明</translation>
@@ -429,7 +428,6 @@
 <translation id="7006788746334555276">內容設定</translation>
 <translation id="7015203776128479407">尚未完成初始同步處理設定。已關閉同步功能。</translation>
 <translation id="7029809446516969842">密碼</translation>
-<translation id="7031882061095297553">同步處理</translation>
 <translation id="7053983685419859001">封鎖</translation>
 <translation id="7062545763355031412">接受並切換帳戶</translation>
 <translation id="7099761977003084116">最近開啟的分頁</translation>
@@ -438,7 +436,6 @@
 <translation id="7133798577887235672">完整名稱</translation>
 <translation id="7136892417564438900">無法使用相機</translation>
 <translation id="7159472599653637159">切換為行動版網站</translation>
-<translation id="7167621057293532233">資料類型</translation>
 <translation id="7173114856073700355">開啟設定</translation>
 <translation id="7189598951263744875">分享...</translation>
 <translation id="7192050974311852563">開始記錄</translation>
@@ -471,7 +468,6 @@
 <translation id="766891008101699113">如要以私密模式瀏覽網頁,請開啟新分頁。</translation>
 <translation id="7671141431838911305">安裝</translation>
 <translation id="7765158879357617694">移動</translation>
-<translation id="7769602470925380267">接受並登出</translation>
 <translation id="7772032839648071052">確認通關密語</translation>
 <translation id="7781829728241885113">昨天</translation>
 <translation id="778855399387580014">在 Chrome 新分頁中進行搜尋。</translation>
@@ -506,7 +502,6 @@
 <translation id="8281781826761538115">預設 - <ph name="DEFAULT_LOCALE" /></translation>
 <translation id="8319076807703933069">新搜尋</translation>
 <translation id="8328777765163860529">關閉全部</translation>
-<translation id="8381750437846184350">控管 Google 使用您瀏覽記錄的方式,針對 Google 所提供的個人化搜尋服務、廣告內容和其他各項 Google 服務調整相關設定</translation>
 <translation id="8407669440184693619">找不到這個網站的密碼</translation>
 <translation id="842017693807136194">目前登入身分</translation>
 <translation id="8428045167754449968">鄉/鎮/市/區</translation>
@@ -561,7 +556,6 @@
 <translation id="9203116392574189331">Handoff</translation>
 <translation id="9223358826628549784">當機報告已送出。</translation>
 <translation id="952704832371081537">取消</translation>
-<translation id="976982866697960176">管理同步資料…</translation>
 <translation id="988141524645182168">其他裝置</translation>
 <translation id="989988560359834682">編輯地址</translation>
 <translation id="994757059139821576">文章建議</translation>
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index f9602ccf..e6724a6 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -506,9 +506,6 @@
     {"language-settings", flag_descriptions::kLanguageSettingsName,
      flag_descriptions::kLanguageSettingsDescription, flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(kLanguageSettings)},
-    {"lock-bottom-toolbar", flag_descriptions::kLockBottomToolbarName,
-     flag_descriptions::kLockBottomToolbarDescription, flags_ui::kOsIos,
-     FEATURE_VALUE_TYPE(fullscreen::features::kLockBottomToolbar)},
     {"toolbar-new-tab-button", flag_descriptions::kToolbarNewTabButtonName,
      flag_descriptions::kToolbarNewTabButtonDescription, flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(kToolbarNewTabButton)},
diff --git a/ios/chrome/browser/prerender/preload_controller.mm b/ios/chrome/browser/prerender/preload_controller.mm
index d5c7500..d5a66adb 100644
--- a/ios/chrome/browser/prerender/preload_controller.mm
+++ b/ios/chrome/browser/prerender/preload_controller.mm
@@ -198,6 +198,8 @@
 
 @implementation PreloadController
 
+@synthesize prerenderedURL = prerenderedURL_;
+
 - (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState {
   DCHECK(browserState);
   DCHECK_CURRENTLY_ON(web::WebThread::UI);
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
index 6cc0752d..4de121a 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -597,9 +597,6 @@
 // The webState of the active tab.
 @property(nonatomic, readonly) web::WebState* currentWebState;
 
-// Whether the safe area insets should be used to adjust the viewport.
-@property(nonatomic, readonly) BOOL usesSafeInsetsForViewportAdjustments;
-
 // Whether the keyboard observer helper is viewed
 @property(nonatomic, strong) KeyboardObserverHelper* observer;
 
@@ -1072,15 +1069,6 @@
              : nullptr;
 }
 
-- (BOOL)usesSafeInsetsForViewportAdjustments {
-  fullscreen::features::ViewportAdjustmentExperiment viewportExperiment =
-      fullscreen::features::GetActiveViewportExperiment();
-  return viewportExperiment ==
-             fullscreen::features::ViewportAdjustmentExperiment::SAFE_AREA ||
-         viewportExperiment ==
-             fullscreen::features::ViewportAdjustmentExperiment::HYBRID;
-}
-
 - (BubblePresenter*)bubblePresenter {
   if (!_bubblePresenter && self.browserState) {
     self.bubblePresenter =
@@ -1686,7 +1674,7 @@
   self.secondaryToolbarNoFullscreenHeightConstraint.constant =
       [self secondaryToolbarHeightWithInset];
   [self updateFootersForFullscreenProgress:self.footerFullscreenProgress];
-  if (!self.usesSafeInsetsForViewportAdjustments && self.currentWebState) {
+  if (self.currentWebState) {
     UIEdgeInsets contentPadding =
         self.currentWebState->GetWebViewProxy().contentInset;
     contentPadding.bottom = AlignValueToPixel(
@@ -3829,9 +3817,6 @@
 // Translates the footer view up and down according to |progress|, where a
 // progress of 1.0 fully shows the footer and a progress of 0.0 fully hides it.
 - (void)updateFootersForFullscreenProgress:(CGFloat)progress {
-  // If the bottom toolbar is locked into place, reset |progress| to 1.0.
-  if (base::FeatureList::IsEnabled(fullscreen::features::kLockBottomToolbar))
-    progress = 1.0;
 
   self.footerFullscreenProgress = progress;
 
@@ -3874,26 +3859,10 @@
   // safe area, so the unsafe top height must be added.
   CGFloat top = AlignValueToPixel(
       self.headerHeight + (progress - 1.0) * [self primaryToolbarHeightDelta]);
-  // If the bottom toolbar is locked into place, use 1.0 instead of |progress|.
-  CGFloat bottomProgress =
-      base::FeatureList::IsEnabled(fullscreen::features::kLockBottomToolbar)
-          ? 1.0
-          : progress;
-  CGFloat bottom = AlignValueToPixel(bottomProgress *
-                                     [self secondaryToolbarHeightWithInset]);
+  CGFloat bottom =
+      AlignValueToPixel(progress * [self secondaryToolbarHeightWithInset]);
 
-  if (self.usesSafeInsetsForViewportAdjustments) {
-    if (fullscreen::features::GetActiveViewportExperiment() ==
-        fullscreen::features::ViewportAdjustmentExperiment::HYBRID) {
-      [self updateWebViewFrameForBottomOffset:bottom];
-    }
-
-    [self updateBrowserSafeAreaForTopToolbarHeight:top
-                               bottomToolbarHeight:bottom];
-  } else {
-    [self updateContentPaddingForTopToolbarHeight:top
-                              bottomToolbarHeight:bottom];
-  }
+  [self updateContentPaddingForTopToolbarHeight:top bottomToolbarHeight:bottom];
 }
 
 // Updates the frame of the web view so that it's |offset| from the bottom of
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_features.h b/ios/chrome/browser/ui/fullscreen/fullscreen_features.h
index 916a651..7a0ad40 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_features.h
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_features.h
@@ -20,6 +20,10 @@
 extern const flags_ui::FeatureEntry::Choice
     kViewportAdjustmentExperimentChoices[6];
 
+// Feature used by finch config to enable smooth scrolling when the default
+// viewport adjustment experiment is selected via command line switches.
+extern const base::Feature kSmoothScrollingDefault;
+
 // Enum type describing viewport adjustment experiments.
 enum class ViewportAdjustmentExperiment : short {
   FRAME = 0,      // Adjust the viewport by resizing the entire WKWebView.
@@ -34,12 +38,13 @@
 };
 
 // Convenience method for retrieving the active viewport adjustment experiment
-// from the command line.
+// from the command line. TODO(crbug.com/914042): Remove once the internal
+// references are moved to ShouldUseSmoothScrolling().
 ViewportAdjustmentExperiment GetActiveViewportExperiment();
 
-// Used to control whether the bottom toolbar should be locked into the extended
-// position (i.e. fullscreen progress == 1.0).
-extern const base::Feature kLockBottomToolbar;
+// Convenience method for determining when to adjust the viewport by resizing
+// WKWebView or using smooth scrolling.
+bool ShouldUseSmoothScrolling();
 
 }  // namespace features
 }  // namespace fullscreen
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_features.mm b/ios/chrome/browser/ui/fullscreen/fullscreen_features.mm
index 0d4f0b9d..74425c40 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_features.mm
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_features.mm
@@ -19,11 +19,6 @@
 const char kSafeAreaChoiceValue[] = "safe-area";
 const char kHybridChoiceValue[] = "hybrid";
 const char kSmoothScrollingChoiceValue[] = "smooth";
-
-// Feature used by finch config to enable smooth scrolling when the default
-// viewport adjustment experiment is selected via command line switches.
-const base::Feature kSmoothScrollingDefault{"FullscreenSmoothScrollingDefault",
-                                            base::FEATURE_ENABLED_BY_DEFAULT};
 }
 
 namespace fullscreen {
@@ -44,6 +39,9 @@
      "smooth"},
     {"Update Frame", kViewportAdjustmentExperimentCommandLineSwitch, "frame"}};
 
+const base::Feature kSmoothScrollingDefault{"FullscreenSmoothScrollingDefault",
+                                            base::FEATURE_ENABLED_BY_DEFAULT};
+
 ViewportAdjustmentExperiment GetActiveViewportExperiment() {
   const base::CommandLine* command_line =
       base::CommandLine::ForCurrentProcess();
@@ -66,8 +64,9 @@
              : ViewportAdjustmentExperiment::FRAME;
 }
 
-const base::Feature kLockBottomToolbar{"LockBottomToolbar",
-                                       base::FEATURE_DISABLED_BY_DEFAULT};
+bool ShouldUseSmoothScrolling() {
+  return base::FeatureList::IsEnabled(kSmoothScrollingDefault);
+}
 
 }  // namespace features
 }  // namespace fullscreen
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_model.h b/ios/chrome/browser/ui/fullscreen/fullscreen_model.h
index f750501..8d6306e2 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_model.h
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_model.h
@@ -73,14 +73,10 @@
 
   // Returns the toolbar insets at |progress|.
   UIEdgeInsets GetToolbarInsetsAtProgress(CGFloat progress) const {
-    const CGFloat kBottomToolbarProgress =
-        base::FeatureList::IsEnabled(fullscreen::features::kLockBottomToolbar)
-            ? 1.0
-            : progress;
     return UIEdgeInsetsMake(
         collapsed_toolbar_height_ +
             progress * (expanded_toolbar_height_ - collapsed_toolbar_height_),
-        0, kBottomToolbarProgress * bottom_toolbar_height_, 0);
+        0, progress * bottom_toolbar_height_, 0);
   }
 
   // Increments and decrements |disabled_counter_| for features that require the
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_web_state_observer.mm b/ios/chrome/browser/ui/fullscreen/fullscreen_web_state_observer.mm
index 80cb935..81f5e6f 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_web_state_observer.mm
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_web_state_observer.mm
@@ -28,8 +28,6 @@
 #error "This file requires ARC support."
 #endif
 
-using fullscreen::features::ViewportAdjustmentExperiment;
-
 FullscreenWebStateObserver::FullscreenWebStateObserver(
     FullscreenController* controller,
     FullscreenModel* model,
@@ -83,18 +81,13 @@
   // - For normal pages, using |contentInset| breaks the layout of fixed-
   //   position DOM elements, so top padding must be accomplished by updating
   //   the WKWebView's frame.
-  bool force_content_inset =
-      fullscreen::features::GetActiveViewportExperiment() ==
-      ViewportAdjustmentExperiment::CONTENT_INSET;
   bool is_pdf = web_state->GetContentsMimeType() == "application/pdf";
-  bool use_content_inset = force_content_inset || is_pdf;
   id<CRWWebViewProxy> web_view_proxy = web_state->GetWebViewProxy();
-  web_view_proxy.shouldUseViewContentInset = use_content_inset;
+  web_view_proxy.shouldUseViewContentInset = is_pdf;
 
-  model_->SetResizesScrollView(!use_content_inset &&
-                               !ios::GetChromeBrowserProvider()
-                                    ->GetFullscreenProvider()
-                                    ->IsInitialized());
+  model_->SetResizesScrollView(!is_pdf && !ios::GetChromeBrowserProvider()
+                                               ->GetFullscreenProvider()
+                                               ->IsInitialized());
 
   // Only reset the model for document-changing navigations or same-document
   // navigations that update the visible URL.
diff --git a/ios/chrome/browser/ui/infobars/coordinators/infobar_confirm_coordinator.mm b/ios/chrome/browser/ui/infobars/coordinators/infobar_confirm_coordinator.mm
index a0dc05f..ece71d4 100644
--- a/ios/chrome/browser/ui/infobars/coordinators/infobar_confirm_coordinator.mm
+++ b/ios/chrome/browser/ui/infobars/coordinators/infobar_confirm_coordinator.mm
@@ -71,7 +71,7 @@
     // from memory.
     self.delegate->RemoveInfoBar();
     _confirmInfobarDelegate = nil;
-    [self.infobarContainer childCoordinatorStopped:self.infobarType];
+    [self.infobarContainer childCoordinatorStopped:self];
   }
 }
 
diff --git a/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm b/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm
index b3ca0653..170e4be 100644
--- a/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm
+++ b/ios/chrome/browser/ui/infobars/coordinators/infobar_coordinator.mm
@@ -93,6 +93,7 @@
   DCHECK(self.browserState);
   DCHECK(self.baseViewController);
   DCHECK(self.bannerViewController);
+  DCHECK(self.started);
 
   // If |self.baseViewController| is not part of the ViewHierarchy the banner
   // shouldn't be presented.
@@ -140,6 +141,7 @@
 }
 
 - (void)presentInfobarModal {
+  DCHECK(self.started);
   ProceduralBlock modalPresentation = ^{
     DCHECK(self.infobarBannerState !=
            InfobarBannerPresentationState::Presented);
@@ -245,7 +247,7 @@
   self.bannerTransitionDriver = nil;
   animatedFullscreenDisabler_ = nullptr;
   [self infobarWasDismissed];
-  [self.infobarContainer childCoordinatorBannerWasDismissed:self.infobarType];
+  [self.infobarContainer childCoordinatorBannerWasDismissed:self];
 }
 
 #pragma mark InfobarBannerPositioner
diff --git a/ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.mm b/ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.mm
index 9d3eb23..f7b1139 100644
--- a/ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.mm
+++ b/ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.mm
@@ -99,7 +99,7 @@
     // from memory.
     self.delegate->RemoveInfoBar();
     _passwordInfoBarDelegate = nil;
-    [self.infobarContainer childCoordinatorStopped:self.infobarType];
+    [self.infobarContainer childCoordinatorStopped:self];
   }
 }
 
diff --git a/ios/chrome/browser/ui/infobars/infobar_container.h b/ios/chrome/browser/ui/infobars/infobar_container.h
index 0aaf5212..b5f33ed 100644
--- a/ios/chrome/browser/ui/infobars/infobar_container.h
+++ b/ios/chrome/browser/ui/infobars/infobar_container.h
@@ -7,19 +7,20 @@
 
 #import <Foundation/Foundation.h>
 
-enum class InfobarType;
+@class InfobarCoordinator;
 
 // Protocol for the InfobarCoordinators to communicate with the InfobarContainer
 // Coordinator.
 @protocol InfobarContainer
 
-// Informs the InfobarContainer Coordinator that its child coordinator of type
-// |infobarType| has dismissed its banner.
-- (void)childCoordinatorBannerWasDismissed:(InfobarType)infobarType;
+// Informs the InfobarContainerCoordinator that |infobarCoordinator| has
+// dismissed its banner.
+- (void)childCoordinatorBannerWasDismissed:
+    (InfobarCoordinator*)infobarCoordinator;
 
-// Informs the InfobarContainer Coordinator that its child coordinator of type
-// |infobarType| has stopped.
-- (void)childCoordinatorStopped:(InfobarType)infobarType;
+// Informs the InfobarContainerCoordinator that |infobarCoordinator| has
+// stopped.
+- (void)childCoordinatorStopped:(InfobarCoordinator*)infobarCoordinator;
 
 @end
 
diff --git a/ios/chrome/browser/ui/infobars/infobar_container_coordinator.mm b/ios/chrome/browser/ui/infobars/infobar_container_coordinator.mm
index acfb588..f3f195ad 100644
--- a/ios/chrome/browser/ui/infobars/infobar_container_coordinator.mm
+++ b/ios/chrome/browser/ui/infobars/infobar_container_coordinator.mm
@@ -48,7 +48,7 @@
 // infobarCoordinators holds all InfobarCoordinators this ContainerCoordinator
 // can display.
 @property(nonatomic, strong)
-    NSMutableDictionary<NSNumber*, InfobarCoordinator*>* infobarCoordinators;
+    NSMutableArray<InfobarCoordinator*>* infobarCoordinators;
 // Array of Coordinators which banners haven't been presented yet. Once a
 // Coordinator banner is presented it should be removed from this Array. If
 // empty then it means there are no banners queued to be presented.
@@ -67,7 +67,7 @@
                               browserState:browserState];
   if (self) {
     _webStateList = webStateList;
-    _infobarCoordinators = [NSMutableDictionary dictionary];
+    _infobarCoordinators = [NSMutableArray array];
     _infobarCoordinatorsToPresent = [NSMutableArray array];
   }
   return self;
@@ -148,8 +148,7 @@
                           completion:(void (^)())completion {
   DCHECK(IsInfobarUIRebootEnabled());
 
-  for (InfobarCoordinator* infobarCoordinator in
-       [self.infobarCoordinators allValues]) {
+  for (InfobarCoordinator* infobarCoordinator in self.infobarCoordinators) {
     if (infobarCoordinator.infobarBannerState !=
         InfobarBannerPresentationState::NotPresented) {
       // Since only one Banner can be presented at any time, dismiss it.
@@ -173,8 +172,7 @@
 #pragma mark - ChromeCoordinator
 
 - (MutableCoordinatorArray*)childCoordinators {
-  return static_cast<MutableCoordinatorArray*>(
-      [self.infobarCoordinators allValues]);
+  return static_cast<MutableCoordinatorArray*>(self.infobarCoordinators);
 }
 
 #pragma mark - Accessors
@@ -196,8 +194,7 @@
 
 - (InfobarBannerPresentationState)infobarBannerState {
   DCHECK(IsInfobarUIRebootEnabled());
-  for (InfobarCoordinator* infobarCoordinator in
-       [self.infobarCoordinators allValues]) {
+  for (InfobarCoordinator* infobarCoordinator in self.infobarCoordinators) {
     if (infobarCoordinator.infobarBannerState !=
         InfobarBannerPresentationState::NotPresented) {
       // Since only one Banner can be presented at any time, early return.
@@ -216,11 +213,9 @@
   InfobarCoordinator* infobarCoordinator =
       static_cast<InfobarCoordinator*>(infoBarDelegate);
 
-  NSNumber* infobarKey =
-      [NSNumber numberWithInt:static_cast<int>(infoBarDelegate.infobarType)];
-  self.infobarCoordinators[infobarKey] = infobarCoordinator;
+  [self.infobarCoordinators addObject:infobarCoordinator];
 
-  // Present the InfobarBanner, and set the Coordinator and View hierarchies.
+  // Configure the Coordinator and try to present the Banner afterwards.
   [infobarCoordinator start];
   // Only set the infobarCoordinator's badgeDelegate if it supports a badge. Not
   // doing so might cause undefined behavior since no badge was added.
@@ -235,7 +230,7 @@
 }
 
 - (void)infobarManagerWillChange {
-  self.infobarCoordinators = [NSMutableDictionary dictionary];
+  self.infobarCoordinators = [NSMutableArray array];
   self.infobarCoordinatorsToPresent = [NSMutableArray array];
 }
 
@@ -251,25 +246,28 @@
 
 #pragma mark InfobarContainer
 
-- (void)childCoordinatorBannerWasDismissed:(InfobarType)infobarType {
+- (void)childCoordinatorBannerWasDismissed:
+    (InfobarCoordinator*)infobarCoordinator {
   InfobarCoordinator* coordinator =
       [self.infobarCoordinatorsToPresent firstObject];
   if (coordinator)
     [self presentBannerForInfobarCoordinator:coordinator];
 }
 
-- (void)childCoordinatorStopped:(InfobarType)infobarType {
-  DCHECK(IsInfobarUIRebootEnabled());
-  NSNumber* infobarKey = [NSNumber numberWithInt:static_cast<int>(infobarType)];
-  [self.infobarCoordinators removeObjectForKey:infobarKey];
+- (void)childCoordinatorStopped:(InfobarCoordinator*)infobarCoordinator {
+  [self.infobarCoordinators removeObject:infobarCoordinator];
+  // Also remove it from |infobarCoordinatorsToPresent| in case it was queued
+  // for a presentation.
+  [self.infobarCoordinatorsToPresent removeObject:infobarCoordinator];
 }
 
 #pragma mark InfobarCommands
 
 - (void)displayModalInfobar:(InfobarType)infobarType {
-  NSNumber* infobarKey = [NSNumber numberWithInt:static_cast<int>(infobarType)];
-  InfobarCoordinator* infobarCoordinator = self.infobarCoordinators[infobarKey];
+  InfobarCoordinator* infobarCoordinator =
+      [self infobarCoordinatorForInfobarTye:infobarType];
   DCHECK(infobarCoordinator);
+  DCHECK(infobarCoordinator.infobarType != InfobarType::kInfobarTypeConfirm);
   [infobarCoordinator presentInfobarModal];
 }
 
@@ -311,4 +309,17 @@
   }
 }
 
+// Returns the InfobarCoordinator for |infobarType|. If there's more than one
+// (e.g. kInfobarTypeConfirm) it will return the first one that was added. If no
+// InfobarCoordinator returns nil.
+- (InfobarCoordinator*)infobarCoordinatorForInfobarTye:
+    (InfobarType)infobarType {
+  for (InfobarCoordinator* coordinator in self.infobarCoordinators) {
+    if (coordinator.infobarType == infobarType) {
+      return coordinator;
+    }
+  }
+  return nil;
+}
+
 @end
diff --git a/ios/chrome/browser/ui/infobars/infobar_container_coordinator_unittest.mm b/ios/chrome/browser/ui/infobars/infobar_container_coordinator_unittest.mm
index 8b72c1f..28ccd75 100644
--- a/ios/chrome/browser/ui/infobars/infobar_container_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/infobars/infobar_container_coordinator_unittest.mm
@@ -680,3 +680,37 @@
   ASSERT_EQ(NSUInteger(2),
             infobar_container_coordinator_.childCoordinators.count);
 }
+
+// Tests that that a second Infobar (added right after the first one) is
+// not displayed if its destroyed before presentation.
+TEST_F(InfobarContainerCoordinatorTest, TestInfobarQueueStoppedNoDisplay) {
+  AddInfobar();
+  AddSecondInfobar();
+  ASSERT_EQ(NSUInteger(2),
+            infobar_container_coordinator_.childCoordinators.count);
+
+  EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
+      base::test::ios::kWaitForUIElementTimeout, ^bool {
+        return coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::Presented;
+      }));
+  ASSERT_EQ(infobar_container_coordinator_.infobarBannerState,
+            InfobarBannerPresentationState::Presented);
+
+  [second_coordinator_ stop];
+  [infobar_container_coordinator_ dismissInfobarBannerAnimated:NO
+                                                    completion:nil];
+  ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
+      base::test::ios::kWaitForUIElementTimeout, ^bool {
+        return coordinator_.infobarBannerState ==
+               InfobarBannerPresentationState::NotPresented;
+      }));
+
+  ASSERT_EQ(infobar_container_coordinator_.infobarBannerState,
+            InfobarBannerPresentationState::NotPresented);
+  ASSERT_EQ(NSUInteger(1),
+            infobar_container_coordinator_.childCoordinators.count);
+}
+
+// TODO(crbug.com/961343): Add tests that use a BadgedInfobar, in order to do
+// this a new TestInfoBarDelegate needs to be created.
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/http_auth_dialogs/BUILD.gn b/ios/chrome/browser/ui/overlays/web_content_area/http_auth_dialogs/BUILD.gn
index 0415e2f..6229011 100644
--- a/ios/chrome/browser/ui/overlays/web_content_area/http_auth_dialogs/BUILD.gn
+++ b/ios/chrome/browser/ui/overlays/web_content_area/http_auth_dialogs/BUILD.gn
@@ -50,7 +50,6 @@
     "//ios/chrome/browser/ui/elements",
     "//ios/chrome/browser/ui/overlays/common/alerts/test",
     "//ios/chrome/browser/ui/overlays/test",
-    "//ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test",
     "//ios/web/public",
     "//ios/web/public/test",
     "//ios/web/public/test/fakes",
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/BUILD.gn b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/BUILD.gn
index 83e68054..20979f4 100644
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/BUILD.gn
+++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/BUILD.gn
@@ -6,12 +6,8 @@
   sources = [
     "java_script_dialog_blocking_action.h",
     "java_script_dialog_blocking_action.mm",
-    "java_script_dialog_overlay_coordinator+subclassing.h",
-    "java_script_dialog_overlay_coordinator.h",
-    "java_script_dialog_overlay_coordinator.mm",
-    "java_script_dialog_overlay_mediator+subclassing.h",
-    "java_script_dialog_overlay_mediator.h",
-    "java_script_dialog_overlay_mediator.mm",
+    "java_script_overlay_mediator_util.h",
+    "java_script_overlay_mediator_util.mm",
   ]
 
   configs += [ "//build/config/compiler:enable_arc" ]
@@ -27,6 +23,7 @@
     "//ios/chrome/browser/ui/dialogs",
     "//ios/chrome/browser/ui/elements",
     "//ios/chrome/browser/ui/overlays:coordinators",
+    "//ios/chrome/browser/ui/overlays/common/alerts",
     "//ui/base",
   ]
 }
@@ -51,6 +48,7 @@
     "//ios/chrome/browser/ui/alert_view_controller",
     "//ios/chrome/browser/ui/elements",
     "//ios/chrome/browser/ui/overlays:coordinators",
+    "//ios/chrome/browser/ui/overlays/common/alerts",
     "//ui/base",
   ]
 }
@@ -75,6 +73,7 @@
     "//ios/chrome/browser/ui/alert_view_controller",
     "//ios/chrome/browser/ui/elements",
     "//ios/chrome/browser/ui/overlays:coordinators",
+    "//ios/chrome/browser/ui/overlays/common/alerts",
     "//ui/base",
   ]
 }
@@ -99,6 +98,7 @@
     "//ios/chrome/browser/ui/alert_view_controller",
     "//ios/chrome/browser/ui/elements",
     "//ios/chrome/browser/ui/overlays:coordinators",
+    "//ios/chrome/browser/ui/overlays/common/alerts",
     "//ui/base",
   ]
 }
@@ -106,12 +106,8 @@
 source_set("unit_tests") {
   testonly = true
   sources = [
-    "java_script_alert_overlay_coordinator_unittest.mm",
     "java_script_alert_overlay_mediator_unittest.mm",
-    "java_script_confirmation_overlay_coordinator_unittest.mm",
     "java_script_confirmation_overlay_mediator_unittest.mm",
-    "java_script_dialog_overlay_mediator_unittest.mm",
-    "java_script_prompt_overlay_coordinator_unittest.mm",
     "java_script_prompt_overlay_mediator_unittest.mm",
   ]
 
@@ -133,8 +129,8 @@
     "//ios/chrome/browser/ui/alert_view_controller/test",
     "//ios/chrome/browser/ui/dialogs",
     "//ios/chrome/browser/ui/elements",
+    "//ios/chrome/browser/ui/overlays/common/alerts/test",
     "//ios/chrome/browser/ui/overlays/test",
-    "//ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test",
     "//ios/web/public",
     "//ios/web/public/test",
     "//ios/web/public/test/fakes",
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.h
index df10076..e0f2d6a 100644
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.h
+++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.h
@@ -5,11 +5,10 @@
 #ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_ALERT_OVERLAY_COORDINATOR_H_
 #define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_ALERT_OVERLAY_COORDINATOR_H_
 
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator.h"
+#import "ios/chrome/browser/ui/overlays/common/alerts/alert_overlay_coordinator.h"
 
 // An OverlayCoordinator that displays the UI for JavaScript alerts.
-@interface JavaScriptAlertOverlayCoordinator
-    : JavaScriptDialogOverlayCoordinator
+@interface JavaScriptAlertOverlayCoordinator : AlertOverlayCoordinator
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_ALERT_OVERLAY_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.mm
index f3fbaca..3092d40f 100644
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.mm
+++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.mm
@@ -6,8 +6,8 @@
 
 #import "ios/chrome/browser/overlays/public/overlay_request.h"
 #import "ios/chrome/browser/overlays/public/web_content_area/java_script_alert_overlay.h"
+#import "ios/chrome/browser/ui/overlays/common/alerts/alert_overlay_coordinator+subclassing.h"
 #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator+subclassing.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -25,7 +25,7 @@
 
 @implementation JavaScriptAlertOverlayCoordinator (Subclassing)
 
-- (JavaScriptDialogOverlayMediator*)newMediator {
+- (AlertOverlayMediator*)newMediator {
   return [[JavaScriptAlertOverlayMediator alloc] initWithRequest:self.request];
 }
 
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.h
index d526815..df73fb22b 100644
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.h
+++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.h
@@ -5,11 +5,19 @@
 #ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_ALERT_OVERLAY_MEDIATOR_H_
 #define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_ALERT_OVERLAY_MEDIATOR_H_
 
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h"
+#import "ios/chrome/browser/ui/overlays/common/alerts/alert_overlay_mediator.h"
+
+class OverlayRequest;
 
 // Mediator object that uses a JavaScriptAlertOverlayRequestConfig to set up the
 // UI for a JavaScript alert overlay.
-@interface JavaScriptAlertOverlayMediator : JavaScriptDialogOverlayMediator
+@interface JavaScriptAlertOverlayMediator : AlertOverlayMediator
+
+// Initializer for a mediator that configures its consumer using |request|.
+- (instancetype)initWithRequest:(OverlayRequest*)request
+    NS_DESIGNATED_INITIALIZER;
+- (instancetype)init NS_UNAVAILABLE;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_ALERT_OVERLAY_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.mm
index 7f4a424..8186e47 100644
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.mm
+++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator.mm
@@ -10,8 +10,9 @@
 #import "ios/chrome/browser/overlays/public/web_content_area/java_script_alert_overlay.h"
 #import "ios/chrome/browser/ui/alert_view_controller/alert_action.h"
 #import "ios/chrome/browser/ui/alert_view_controller/alert_consumer.h"
+#import "ios/chrome/browser/ui/overlays/common/alerts/alert_overlay_mediator+subclassing.h"
 #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h"
+#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_overlay_mediator_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -20,45 +21,55 @@
 #endif
 
 @interface JavaScriptAlertOverlayMediator ()
-// The alert config.
+@property(nonatomic, readonly) OverlayRequest* request;
 @property(nonatomic, readonly) JavaScriptAlertOverlayRequestConfig* config;
 @end
 
 @implementation JavaScriptAlertOverlayMediator
 
+- (instancetype)initWithRequest:(OverlayRequest*)request {
+  if (self = [super init]) {
+    _request = request;
+    DCHECK(_request);
+    // Verify that the request is configured for JavaScript alerts.
+    DCHECK(_request->GetConfig<JavaScriptAlertOverlayRequestConfig>());
+  }
+  return self;
+}
+
 #pragma mark - Accessors
 
 - (JavaScriptAlertOverlayRequestConfig*)config {
   return self.request->GetConfig<JavaScriptAlertOverlayRequestConfig>();
 }
 
-- (void)setConsumer:(id<AlertConsumer>)consumer {
-  if (self.consumer == consumer)
-    return;
-  [super setConsumer:consumer];
+@end
+
+@implementation JavaScriptAlertOverlayMediator (Subclassing)
+
+- (NSString*)alertTitle {
+  return GetJavaScriptDialogTitle(self.config->source(),
+                                  self.config->message());
+}
+
+- (NSString*)alertMessage {
+  return GetJavaScriptDialogMessage(self.config->source(),
+                                    self.config->message());
+}
+
+- (NSArray<AlertAction*>*)alertActions {
   __weak __typeof__(self) weakSelf = self;
-  NSMutableArray* actions = [@[ [AlertAction
+  NSMutableArray<AlertAction*>* actions = [@[ [AlertAction
       actionWithTitle:l10n_util::GetNSString(IDS_OK)
                 style:UIAlertActionStyleDefault
               handler:^(AlertAction* action) {
                 [weakSelf.delegate stopDialogForMediator:weakSelf];
               }] ] mutableCopy];
-  AlertAction* blockingAction = GetBlockingAlertAction(self);
+  AlertAction* blockingAction =
+      GetBlockingAlertAction(self, self.config->source());
   if (blockingAction)
     [actions addObject:blockingAction];
-  [self.consumer setActions:actions];
-}
-
-@end
-
-@implementation JavaScriptAlertOverlayMediator (Subclassing)
-
-- (const JavaScriptDialogSource&)requestSource {
-  return self.config->source();
-}
-
-- (const std::string&)requestMessage {
-  return self.config->message();
+  return actions;
 }
 
 @end
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator_unittest.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator_unittest.mm
index 4df196b..18d0bae 100644
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_mediator_unittest.mm
@@ -12,8 +12,7 @@
 #import "ios/chrome/browser/ui/alert_view_controller/alert_action.h"
 #import "ios/chrome/browser/ui/alert_view_controller/test/fake_alert_consumer.h"
 #import "ios/chrome/browser/ui/dialogs/java_script_dialog_blocking_state.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_mediator_test.h"
+#import "ios/chrome/browser/ui/overlays/common/alerts/test/alert_overlay_mediator_test.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/web/public/test/fakes/test_web_state.h"
 #include "testing/gtest_mac.h"
@@ -23,7 +22,7 @@
 #error "This file requires ARC support."
 #endif
 
-using JavaScriptAlertOverlayMediatorTest = JavaScriptDialogOverlayMediatorTest;
+using JavaScriptAlertOverlayMediatorTest = AlertOverlayMediatorTest;
 
 // Tests that the consumer values are set correctly for alerts from the main
 // frame.
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator.h
index 5c39b5c..2cc44a4 100644
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator.h
+++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator.h
@@ -5,11 +5,10 @@
 #ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_CONFIRMATION_OVERLAY_COORDINATOR_H_
 #define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_CONFIRMATION_OVERLAY_COORDINATOR_H_
 
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator.h"
+#import "ios/chrome/browser/ui/overlays/common/alerts/alert_overlay_coordinator.h"
 
 // An OverlayCoordinator that displays the UI for JavaScript confirmations.
-@interface JavaScriptConfirmationOverlayCoordinator
-    : JavaScriptDialogOverlayCoordinator
+@interface JavaScriptConfirmationOverlayCoordinator : AlertOverlayCoordinator
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_CONFIRMATION_OVERLAY_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator.mm
index 2e2e768..1759c0e 100644
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator.mm
+++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator.mm
@@ -4,31 +4,15 @@
 
 #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator.h"
 
+#import "ios/chrome/browser/overlays/public/overlay_request.h"
+#import "ios/chrome/browser/overlays/public/web_content_area/java_script_confirmation_overlay.h"
+#import "ios/chrome/browser/ui/overlays/common/alerts/alert_overlay_coordinator+subclassing.h"
+#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.h"
+
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
-#include "base/strings/sys_string_conversions.h"
-#include "components/strings/grit/components_strings.h"
-#import "ios/chrome/browser/overlays/public/overlay_request.h"
-#import "ios/chrome/browser/overlays/public/overlay_response.h"
-#import "ios/chrome/browser/overlays/public/web_content_area/java_script_confirmation_overlay.h"
-#import "ios/chrome/browser/ui/alert_view_controller/alert_action.h"
-#import "ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h"
-#import "ios/chrome/browser/ui/overlays/overlay_request_coordinator_delegate.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator+subclassing.h"
-#include "ios/chrome/grit/ios_strings.h"
-#include "ui/base/l10n/l10n_util.h"
-
-@interface JavaScriptConfirmationOverlayCoordinator ()
-
-// Returns the confirmation configuration from the OverlayRequest.
-@property(nonatomic, readonly)
-    JavaScriptConfirmationOverlayRequestConfig* confirmationConfig;
-
-@end
-
 @implementation JavaScriptConfirmationOverlayCoordinator
 
 #pragma mark - OverlayRequestCoordinator
@@ -41,7 +25,7 @@
 
 @implementation JavaScriptConfirmationOverlayCoordinator (Subclassing)
 
-- (JavaScriptDialogOverlayMediator*)newMediator {
+- (AlertOverlayMediator*)newMediator {
   return [[JavaScriptConfirmationOverlayMediator alloc]
       initWithRequest:self.request];
 }
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.h
index 1eb4a73..7d7eb42 100644
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.h
+++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.h
@@ -5,12 +5,19 @@
 #ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_CONFIRMATION_OVERLAY_MEDIATOR_H_
 #define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_CONFIRMATION_OVERLAY_MEDIATOR_H_
 
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h"
+#import "ios/chrome/browser/ui/overlays/common/alerts/alert_overlay_mediator.h"
+
+class OverlayRequest;
 
 // Mediator object that uses a JavaScriptConfirmationOverlayRequestConfig to set
 // up the UI for a JavaScript confirmation overlay.
-@interface JavaScriptConfirmationOverlayMediator
-    : JavaScriptDialogOverlayMediator
+@interface JavaScriptConfirmationOverlayMediator : AlertOverlayMediator
+
+// Initializer for a mediator that configures its consumer using |request|.
+- (instancetype)initWithRequest:(OverlayRequest*)request
+    NS_DESIGNATED_INITIALIZER;
+- (instancetype)init NS_UNAVAILABLE;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_CONFIRMATION_OVERLAY_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.mm
index 84036be..a6aeef7 100644
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.mm
+++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.mm
@@ -4,7 +4,6 @@
 
 #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator.h"
 
-#include "base/strings/sys_string_conversions.h"
 #include "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/overlays/public/overlay_request.h"
 #import "ios/chrome/browser/overlays/public/overlay_response.h"
@@ -12,8 +11,7 @@
 #import "ios/chrome/browser/ui/alert_view_controller/alert_action.h"
 #import "ios/chrome/browser/ui/alert_view_controller/alert_consumer.h"
 #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h"
-#include "ios/chrome/grit/ios_strings.h"
+#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_overlay_mediator_util.h"
 #include "ui/base/l10n/l10n_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -21,23 +19,56 @@
 #endif
 
 @interface JavaScriptConfirmationOverlayMediator ()
-// The confirmation config.
+@property(nonatomic, readonly) OverlayRequest* request;
 @property(nonatomic, readonly)
     JavaScriptConfirmationOverlayRequestConfig* config;
+
+// Sets the OverlayResponse using the user's selection from the confirmation UI.
+- (void)setConfirmationResponse:(BOOL)dialogConfirmed;
 @end
 
 @implementation JavaScriptConfirmationOverlayMediator
 
+- (instancetype)initWithRequest:(OverlayRequest*)request {
+  if (self = [super init]) {
+    _request = request;
+    DCHECK(_request);
+    // Verify that the request is configured for JavaScript confirmations.
+    DCHECK(_request->GetConfig<JavaScriptConfirmationOverlayRequestConfig>());
+  }
+  return self;
+}
+
 #pragma mark - Accessors
 
 - (JavaScriptConfirmationOverlayRequestConfig*)config {
   return self.request->GetConfig<JavaScriptConfirmationOverlayRequestConfig>();
 }
 
-- (void)setConsumer:(id<AlertConsumer>)consumer {
-  if (self.consumer == consumer)
-    return;
-  [super setConsumer:consumer];
+#pragma mark - Response helpers
+
+// Sets the OverlayResponse using the user's selection from the confirmation UI.
+- (void)setConfirmationResponse:(BOOL)dialogConfirmed {
+  self.request->set_response(
+      OverlayResponse::CreateWithInfo<
+          JavaScriptConfirmationOverlayResponseInfo>(dialogConfirmed));
+}
+
+@end
+
+@implementation JavaScriptConfirmationOverlayMediator (Subclassing)
+
+- (NSString*)alertTitle {
+  return GetJavaScriptDialogTitle(self.config->source(),
+                                  self.config->message());
+}
+
+- (NSString*)alertMessage {
+  return GetJavaScriptDialogMessage(self.config->source(),
+                                    self.config->message());
+}
+
+- (NSArray<AlertAction*>*)alertActions {
   __weak __typeof__(self) weakSelf = self;
   NSMutableArray* actions = [@[
     [AlertAction actionWithTitle:l10n_util::GetNSString(IDS_OK)
@@ -57,31 +88,11 @@
                                stopDialogForMediator:strongSelf];
                          }],
   ] mutableCopy];
-  AlertAction* blockingAction = GetBlockingAlertAction(self);
+  AlertAction* blockingAction =
+      GetBlockingAlertAction(self, self.config->source());
   if (blockingAction)
     [actions addObject:blockingAction];
-  [self.consumer setActions:actions];
-}
-
-#pragma mark - Response helpers
-
-// Sets the OverlayResponse using the user's selection from the confirmation UI.
-- (void)setConfirmationResponse:(BOOL)dialogConfirmed {
-  self.request->set_response(
-      OverlayResponse::CreateWithInfo<
-          JavaScriptConfirmationOverlayResponseInfo>(dialogConfirmed));
-}
-
-@end
-
-@implementation JavaScriptConfirmationOverlayMediator (Subclassing)
-
-- (const JavaScriptDialogSource&)requestSource {
-  return self.config->source();
-}
-
-- (const std::string&)requestMessage {
-  return self.config->message();
+  return actions;
 }
 
 @end
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator_unittest.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator_unittest.mm
index 3856ab7..d535aae 100644
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_mediator_unittest.mm
@@ -13,8 +13,7 @@
 #import "ios/chrome/browser/ui/alert_view_controller/alert_action.h"
 #import "ios/chrome/browser/ui/alert_view_controller/test/fake_alert_consumer.h"
 #import "ios/chrome/browser/ui/dialogs/java_script_dialog_blocking_state.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_mediator_test.h"
+#import "ios/chrome/browser/ui/overlays/common/alerts/test/alert_overlay_mediator_test.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/web/public/test/fakes/test_web_state.h"
 #include "testing/gtest_mac.h"
@@ -25,7 +24,7 @@
 #endif
 
 class JavaScriptConfirmationOverlayMediatorTest
-    : public JavaScriptDialogOverlayMediatorTest {
+    : public AlertOverlayMediatorTest {
  public:
   JavaScriptConfirmationOverlayMediatorTest()
       : url_("https://chromium.test"), message_("Message") {
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.h
index 7c663ad..7bb329b 100644
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.h
+++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.h
@@ -7,11 +7,13 @@
 
 #import "ios/chrome/browser/ui/alert_view_controller/alert_action.h"
 
-@class JavaScriptDialogOverlayMediator;
+@class AlertOverlayMediator;
+class JavaScriptDialogSource;
 
-// Returns the dialog blocking option for a JavaScript dialog being configured
-// by |mediator|, which is expected to be non-nil.  Returns nil if no blocking
-// option should be added to the dialog.
-AlertAction* GetBlockingAlertAction(JavaScriptDialogOverlayMediator* mediator);
+// Returns the dialog blocking option for a JavaScript dialog from |source|
+// being configured by |mediator|, which is expected to be non-nil.  Returns nil
+// if no blocking option should be added to the dialog.
+AlertAction* GetBlockingAlertAction(AlertOverlayMediator* mediator,
+                                    const JavaScriptDialogSource& source);
 
 #endif  // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_DIALOG_BLOCKING_ACTION_H_
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.mm
index 371db64..a2eed9b 100644
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.mm
+++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.mm
@@ -7,8 +7,7 @@
 #include "base/logging.h"
 #include "ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_source.h"
 #import "ios/chrome/browser/ui/dialogs/java_script_dialog_blocking_state.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h"
+#import "ios/chrome/browser/ui/overlays/common/alerts/alert_overlay_mediator.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -29,13 +28,13 @@
 }
 }  // namespace
 
-AlertAction* GetBlockingAlertAction(JavaScriptDialogOverlayMediator* mediator) {
-  const JavaScriptDialogSource& source = mediator.requestSource;
+AlertAction* GetBlockingAlertAction(AlertOverlayMediator* mediator,
+                                    const JavaScriptDialogSource& source) {
   JavaScriptDialogBlockingState* blocking_state = GetBlockingState(source);
   if (!blocking_state || !blocking_state->show_blocking_option())
     return nil;
 
-  __weak JavaScriptDialogOverlayMediator* weakMediator = mediator;
+  __weak AlertOverlayMediator* weakMediator = mediator;
   NSString* action_title =
       l10n_util::GetNSString(IDS_IOS_JAVA_SCRIPT_DIALOG_BLOCKING_BUTTON_TEXT);
   return [AlertAction
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator+subclassing.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator+subclassing.h
deleted file mode 100644
index 162de79..0000000
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator+subclassing.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 IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_DIALOG_OVERLAY_COORDINATOR_SUBCLASSING_H_
-#define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_DIALOG_OVERLAY_COORDINATOR_SUBCLASSING_H_
-
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator.h"
-
-@class AlertViewController;
-@class JavaScriptDialogOverlayMediator;
-
-// Category that allows subclasses to update UI using the OverlayRequest
-// configuration.
-@interface JavaScriptDialogOverlayCoordinator (Subclassing)
-
-// The alert used to show the dialog UI.
-@property(nonatomic, readonly) AlertViewController* alertViewController;
-
-// Subclasses must override this selector to create a mediator that will
-// configure the alert using the OverlayRequest's config.
-- (JavaScriptDialogOverlayMediator*)newMediator;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_DIALOG_OVERLAY_COORDINATOR_SUBCLASSING_H_
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator.h
deleted file mode 100644
index 5f22615..0000000
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator.h
+++ /dev/null
@@ -1,15 +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 IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_DIALOG_OVERLAY_COORDINATOR_H_
-#define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_DIALOG_OVERLAY_COORDINATOR_H_
-
-#import "ios/chrome/browser/ui/overlays/overlay_request_coordinator.h"
-
-// An OverlayRequestCoordinator superclass that is used to display UI for
-// JavaScript dialogs.
-@interface JavaScriptDialogOverlayCoordinator : OverlayRequestCoordinator
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_DIALOG_OVERLAY_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator.mm
deleted file mode 100644
index 0d0113b..0000000
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator.mm
+++ /dev/null
@@ -1,113 +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.
-
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator.h"
-
-#include "base/strings/sys_string_conversions.h"
-#include "components/strings/grit/components_strings.h"
-#include "components/url_formatter/elide_url.h"
-#include "ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_source.h"
-#import "ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h"
-#import "ios/chrome/browser/ui/dialogs/java_script_dialog_blocking_state.h"
-#import "ios/chrome/browser/ui/overlays/overlay_request_coordinator_delegate.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator+subclassing.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h"
-#include "ios/chrome/grit/ios_strings.h"
-#include "ui/base/l10n/l10n_util.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-@interface JavaScriptDialogOverlayCoordinator () <
-    JavaScriptDialogOverlayMediatorDelegate>
-// Whether the coordinator has been started.
-@property(nonatomic, getter=isStarted) BOOL started;
-// The alert view controller.
-@property(nonatomic) AlertViewController* alertViewController;
-// The mediator.
-@property(nonatomic) JavaScriptDialogOverlayMediator* mediator;
-@end
-
-@implementation JavaScriptDialogOverlayCoordinator
-
-#pragma mark - Accessors
-
-- (void)setMediator:(JavaScriptDialogOverlayMediator*)mediator {
-  if (_mediator == mediator)
-    return;
-  _mediator.delegate = nil;
-  _mediator = mediator;
-  _mediator.delegate = self;
-}
-
-#pragma mark - JavaScriptDialogOverlayMediatorDelegate
-
-- (void)stopDialogForMediator:(JavaScriptDialogOverlayMediator*)mediator {
-  DCHECK_EQ(self.mediator, mediator);
-  [self stopAnimated:YES];
-}
-
-#pragma mark - OverlayCoordinator
-
-+ (BOOL)supportsRequest:(OverlayRequest*)request {
-  // Subclasses implement.
-  return NO;
-}
-
-- (UIViewController*)viewController {
-  return self.alertViewController;
-}
-
-- (void)startAnimated:(BOOL)animated {
-  if (self.started)
-    return;
-  self.alertViewController = [[AlertViewController alloc] init];
-  self.alertViewController.modalPresentationStyle =
-      UIModalPresentationOverCurrentContext;
-  self.alertViewController.modalTransitionStyle =
-      UIModalTransitionStyleCrossDissolve;
-  self.mediator = [self newMediator];
-  self.mediator.consumer = self.alertViewController;
-  __weak __typeof__(self) weakSelf = self;
-  [self.baseViewController
-      presentViewController:self.alertViewController
-                   animated:animated
-                 completion:^{
-                   __typeof__(self) strongSelf = weakSelf;
-                   if (!strongSelf)
-                     return;
-                   strongSelf.delegate->OverlayUIDidFinishPresentation(
-                       strongSelf.request);
-                 }];
-  self.started = YES;
-}
-
-- (void)stopAnimated:(BOOL)animated {
-  if (!self.started)
-    return;
-  __weak __typeof__(self) weakSelf = self;
-  [self.baseViewController
-      dismissViewControllerAnimated:animated
-                         completion:^{
-                           __typeof__(self) strongSelf = weakSelf;
-                           if (!strongSelf)
-                             return;
-                           strongSelf.alertViewController = nil;
-                           strongSelf.delegate->OverlayUIDidFinishDismissal(
-                               weakSelf.request);
-                         }];
-  self.started = NO;
-}
-
-@end
-
-@implementation JavaScriptDialogOverlayCoordinator (Subclassing)
-
-- (JavaScriptDialogOverlayMediator*)newMediator {
-  NOTREACHED() << "Subclasses implement.";
-  return nil;
-}
-
-@end
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h
deleted file mode 100644
index 56d5c8b6..0000000
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h
+++ /dev/null
@@ -1,24 +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 IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_DIALOG_OVERLAY_MEDIATOR_SUBCLASSING_H_
-#define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_DIALOG_OVERLAY_MEDIATOR_SUBCLASSING_H_
-
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h"
-
-class JavaScriptDialogSource;
-
-// Category used by JavaScriptDialogOverlayMediator subclasses to provide
-// information from their OverlayRequests.
-@interface JavaScriptDialogOverlayMediator (Subclassing)
-
-// Returns the source for the OverlayRequest.
-@property(nonatomic, readonly) const JavaScriptDialogSource& requestSource;
-
-// Returns the message for the OverlayRequest.
-@property(nonatomic, readonly) const std::string& requestMessage;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_DIALOG_OVERLAY_MEDIATOR_SUBCLASSING_H_
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h
deleted file mode 100644
index 3ea5d1aa..0000000
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_DIALOG_OVERLAY_MEDIATOR_H_
-#define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_DIALOG_OVERLAY_MEDIATOR_H_
-
-#import <Foundation/Foundation.h>
-
-class OverlayRequest;
-@protocol AlertConsumer;
-@protocol JavaScriptDialogOverlayMediatorDelegate;
-
-// Mediator superclass for configuring AlertConsumers for JavaScript dialog
-// overlays.
-@interface JavaScriptDialogOverlayMediator : NSObject
-
-// The request passed on initialization.
-@property(nonatomic, readonly) OverlayRequest* request;
-
-// The consumer to be updated by this mediator.  Setting to a new value uses the
-// configuration data in |request| to update the new consumer.
-@property(nonatomic, weak) id<AlertConsumer> consumer;
-
-// The mediator's delegate.
-@property(nonatomic, weak) id<JavaScriptDialogOverlayMediatorDelegate> delegate;
-
-// Designated initializer for a mediator that uses |request|'s configuration to
-// set up an AlertConsumer.
-- (instancetype)initWithRequest:(OverlayRequest*)request
-    NS_DESIGNATED_INITIALIZER;
-- (instancetype)init NS_UNAVAILABLE;
-
-@end
-
-// Protocol used by the actions set up by the JavaScriptDialogOverlayMediator.
-@protocol JavaScriptDialogOverlayMediatorDelegate <NSObject>
-
-// Called by |mediator| to dismiss the dialog overlay when an action is tapped.
-- (void)stopDialogForMediator:(JavaScriptDialogOverlayMediator*)mediator;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_DIALOG_OVERLAY_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.mm
deleted file mode 100644
index b5612e2..0000000
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.mm
+++ /dev/null
@@ -1,54 +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.
-
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h"
-
-#include "base/logging.h"
-#import "base/strings/sys_string_conversions.h"
-#include "components/strings/grit/components_strings.h"
-#include "components/url_formatter/elide_url.h"
-#include "ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_source.h"
-#import "ios/chrome/browser/ui/alert_view_controller/alert_consumer.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h"
-#include "ios/chrome/grit/ios_strings.h"
-#include "ui/base/l10n/l10n_util.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-@implementation JavaScriptDialogOverlayMediator
-
-- (instancetype)initWithRequest:(OverlayRequest*)request {
-  if (self = [super init]) {
-    _request = request;
-    DCHECK(_request);
-  }
-  return self;
-}
-
-#pragma mark - Accessors
-
-- (void)setConsumer:(id<AlertConsumer>)consumer {
-  if (_consumer == consumer)
-    return;
-  _consumer = consumer;
-
-  if (!_consumer)
-    return;
-  NSString* requestMessage = base::SysUTF8ToNSString(self.requestMessage);
-  if (self.requestSource.is_main_frame()) {
-    // If the requesting page's URL is already displayed in the location bar,
-    // there is no need to add information about the request source.  Instead,
-    // show the request's message text as the alert's title.
-    [_consumer setTitle:requestMessage];
-  } else {
-    [_consumer
-        setTitle:l10n_util::GetNSString(
-                     IDS_JAVASCRIPT_MESSAGEBOX_TITLE_NONSTANDARD_URL_IFRAME)];
-    [_consumer setMessage:requestMessage];
-  }
-}
-
-@end
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator_unittest.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator_unittest.mm
deleted file mode 100644
index 1447b32a..0000000
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator_unittest.mm
+++ /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.
-
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h"
-
-#include "base/strings/sys_string_conversions.h"
-#include "components/strings/grit/components_strings.h"
-#include "components/url_formatter/elide_url.h"
-#include "ios/chrome/browser/overlays/public/overlay_request.h"
-#include "ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_source.h"
-#include "ios/chrome/browser/overlays/test/fake_overlay_user_data.h"
-#import "ios/chrome/browser/ui/alert_view_controller/test/fake_alert_consumer.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_mediator_test.h"
-#include "ios/chrome/grit/ios_strings.h"
-#import "ios/web/public/test/fakes/test_web_state.h"
-#include "testing/gtest_mac.h"
-#include "testing/platform_test.h"
-#include "ui/base/l10n/l10n_util.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-@interface FakeJavaScriptDialogOverlayMediator
-    : JavaScriptDialogOverlayMediator {
-  web::TestWebState _webState;
-  std::unique_ptr<JavaScriptDialogSource> _source;
-  std::string _message;
-}
-// Initializer for a mediator that has a JavaScriptDialogSource with |sourceURL|
-// and |isMainFrame|.  |message| is the dialog's message text.
-- (instancetype)initWithRequest:(OverlayRequest*)request
-                      sourceURL:(const GURL&)sourceURL
-                    isMainFrame:(BOOL)isMainFrame
-                        message:(const std::string&)message;
-@end
-
-@implementation FakeJavaScriptDialogOverlayMediator
-
-- (instancetype)initWithRequest:(OverlayRequest*)request
-                      sourceURL:(const GURL&)sourceURL
-                    isMainFrame:(BOOL)isMainFrame
-                        message:(const std::string&)message {
-  if (self = [super initWithRequest:request]) {
-    _source = std::make_unique<JavaScriptDialogSource>(&_webState, sourceURL,
-                                                       isMainFrame);
-    _message = message;
-  }
-  return self;
-}
-
-@end
-
-@implementation FakeJavaScriptDialogOverlayMediator (Subclassing)
-
-- (const JavaScriptDialogSource&)requestSource {
-  return *_source.get();
-}
-
-- (const std::string&)requestMessage {
-  return _message;
-}
-
-@end
-
-// Test fixture for JavaScriptDialogOverlayMediator.
-using JavaScriptDialogOverlayMediatorTest = JavaScriptDialogOverlayMediatorTest;
-
-// Tests the JavaScript dialog setup from the main frame.
-TEST_F(JavaScriptDialogOverlayMediatorTest, MainFrame) {
-  std::unique_ptr<OverlayRequest> request =
-      OverlayRequest::CreateWithConfig<FakeOverlayUserData>(nullptr);
-  const GURL kUrl("https://chromium.org");
-  const std::string kMessage("Message");
-  SetMediator([[FakeJavaScriptDialogOverlayMediator alloc]
-      initWithRequest:request.get()
-            sourceURL:kUrl
-          isMainFrame:YES
-              message:kMessage]);
-
-  // For the main frame, the URL is already displayed in the location bar, so
-  // there is no need to add source information.  The message is used as the
-  // consumer's title in this case.
-  EXPECT_NSEQ(base::SysUTF8ToNSString(kMessage), consumer().title);
-}
-
-// Tests the JavaScript dialog setup from an iframe.
-TEST_F(JavaScriptDialogOverlayMediatorTest, IFrameSetup) {
-  std::unique_ptr<OverlayRequest> request =
-      OverlayRequest::CreateWithConfig<FakeOverlayUserData>(nullptr);
-  const GURL kUrl("https://chromium.org");
-  const std::string kMessage("Message");
-  SetMediator([[FakeJavaScriptDialogOverlayMediator alloc]
-      initWithRequest:request.get()
-            sourceURL:kUrl
-          isMainFrame:NO
-              message:kMessage]);
-
-  NSString* expected_title = l10n_util::GetNSString(
-      IDS_JAVASCRIPT_MESSAGEBOX_TITLE_NONSTANDARD_URL_IFRAME);
-  EXPECT_NSEQ(expected_title, consumer().title);
-  EXPECT_NSEQ(base::SysUTF8ToNSString(kMessage), consumer().message);
-}
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_overlay_mediator_util.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_overlay_mediator_util.h
new file mode 100644
index 0000000..9928847
--- /dev/null
+++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_overlay_mediator_util.h
@@ -0,0 +1,19 @@
+// 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_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_OVERLAY_MEDIATOR_UTIL_H_
+#define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_OVERLAY_MEDIATOR_UTIL_H_
+
+#import <Foundation/Foundation.h>
+#include <string>
+
+class JavaScriptDialogSource;
+
+NSString* GetJavaScriptDialogTitle(const JavaScriptDialogSource& source,
+                                   const std::string& config_message);
+
+NSString* GetJavaScriptDialogMessage(const JavaScriptDialogSource& source,
+                                     const std::string& config_message);
+
+#endif  // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_OVERLAY_MEDIATOR_UTIL_H_
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_overlay_mediator_util.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_overlay_mediator_util.mm
new file mode 100644
index 0000000..3534a19
--- /dev/null
+++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_overlay_mediator_util.mm
@@ -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.
+
+#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_overlay_mediator_util.h"
+
+#include "base/strings/sys_string_conversions.h"
+#include "components/strings/grit/components_strings.h"
+#include "ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_source.h"
+#include "ios/chrome/grit/ios_strings.h"
+#include "ui/base/l10n/l10n_util.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+NSString* GetJavaScriptDialogTitle(const JavaScriptDialogSource& source,
+                                   const std::string& config_message) {
+  return source.is_main_frame()
+             ? base::SysUTF8ToNSString(config_message)
+             : l10n_util::GetNSString(
+                   IDS_JAVASCRIPT_MESSAGEBOX_TITLE_NONSTANDARD_URL_IFRAME);
+}
+
+NSString* GetJavaScriptDialogMessage(const JavaScriptDialogSource& source,
+                                     const std::string& config_message) {
+  return source.is_main_frame() ? nil : base::SysUTF8ToNSString(config_message);
+}
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator.h
index f6224b5c..978b8ab 100644
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator.h
+++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator.h
@@ -5,11 +5,10 @@
 #ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_PROMPT_OVERLAY_COORDINATOR_H_
 #define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_PROMPT_OVERLAY_COORDINATOR_H_
 
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator.h"
+#import "ios/chrome/browser/ui/overlays/common/alerts/alert_overlay_coordinator.h"
 
 // An OverlayCoordinator that displays the UI for JavaScript prompts.
-@interface JavaScriptPromptOverlayCoordinator
-    : JavaScriptDialogOverlayCoordinator
+@interface JavaScriptPromptOverlayCoordinator : AlertOverlayCoordinator
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_PROMPT_OVERLAY_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator.mm
index bcfeae8..3b984806 100644
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator.mm
+++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator.mm
@@ -6,23 +6,13 @@
 
 #import "ios/chrome/browser/overlays/public/overlay_request.h"
 #import "ios/chrome/browser/overlays/public/web_content_area/java_script_prompt_overlay.h"
-#import "ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator+subclassing.h"
+#import "ios/chrome/browser/ui/overlays/common/alerts/alert_overlay_coordinator+subclassing.h"
 #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
-@interface JavaScriptPromptOverlayCoordinator () <
-    JavaScriptPromptOverlayMediatorDataSource>
-
-// Returns the prompt configuration from the OverlayRequest.
-@property(nonatomic, readonly)
-    JavaScriptPromptOverlayRequestConfig* promptConfig;
-
-@end
-
 @implementation JavaScriptPromptOverlayCoordinator
 
 #pragma mark - OverlayCoordinator
@@ -31,21 +21,12 @@
   return !!request->GetConfig<JavaScriptPromptOverlayRequestConfig>();
 }
 
-#pragma mark - JavaScriptPromptOverlayMediatorDataSource
-
-- (NSString*)promptInputForMediator:(JavaScriptPromptOverlayMediator*)mediator {
-  return self.alertViewController.textFieldResults.firstObject;
-}
-
 @end
 
 @implementation JavaScriptPromptOverlayCoordinator (Subclassing)
 
-- (JavaScriptDialogOverlayMediator*)newMediator {
-  JavaScriptPromptOverlayMediator* mediator =
-      [[JavaScriptPromptOverlayMediator alloc] initWithRequest:self.request];
-  mediator.dataSource = self;
-  return mediator;
+- (AlertOverlayMediator*)newMediator {
+  return [[JavaScriptPromptOverlayMediator alloc] initWithRequest:self.request];
 }
 
 @end
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.h
index 710e40c2..39c7213 100644
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.h
+++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.h
@@ -5,29 +5,21 @@
 #ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_PROMPT_OVERLAY_MEDIATOR_H_
 #define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_JAVA_SCRIPT_PROMPT_OVERLAY_MEDIATOR_H_
 
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h"
+#import "ios/chrome/browser/ui/overlays/common/alerts/alert_overlay_mediator.h"
 
-class JavaScriptPromptOverlayRequestConfig;
-@protocol JavaScriptPromptOverlayMediatorDataSource;
+class OverlayRequest;
 
 // The accessibility ID for prompt's text field.
 extern NSString* const kJavaScriptPromptTextFieldAccessibiltyIdentifier;
 
 // Mediator object that uses a JavaScriptPromptOverlayRequestConfig to set
 // up the UI for a JavaScript prompt overlay.
-@interface JavaScriptPromptOverlayMediator : JavaScriptDialogOverlayMediator
+@interface JavaScriptPromptOverlayMediator : AlertOverlayMediator
 
-// The datasource for prompt input values.
-@property(nonatomic, weak) id<JavaScriptPromptOverlayMediatorDataSource>
-    dataSource;
-
-@end
-
-// Protocol used to provide the text input from the prompt UI to the mediator.
-@protocol JavaScriptPromptOverlayMediatorDataSource <NSObject>
-
-// Returns the input value for the prompt UI set up by |mediator|.
-- (NSString*)promptInputForMediator:(JavaScriptPromptOverlayMediator*)mediator;
+// Initializer for a mediator that configures its consumer using |request|.
+- (instancetype)initWithRequest:(OverlayRequest*)request
+    NS_DESIGNATED_INITIALIZER;
+- (instancetype)init NS_UNAVAILABLE;
 
 @end
 
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.mm
index 938cf81..4ac869f 100644
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.mm
+++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator.mm
@@ -12,10 +12,10 @@
 #import "ios/chrome/browser/ui/alert_view_controller/alert_action.h"
 #import "ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h"
 #import "ios/chrome/browser/ui/elements/text_field_configuration.h"
+#import "ios/chrome/browser/ui/overlays/common/alerts/alert_overlay_mediator+subclassing.h"
 #import "ios/chrome/browser/ui/overlays/overlay_request_coordinator_delegate.h"
 #import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_blocking_action.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_coordinator+subclassing.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator+subclassing.h"
+#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_overlay_mediator_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -27,60 +27,33 @@
     @"JavaScriptPromptTextFieldAccessibiltyIdentifier";
 
 @interface JavaScriptPromptOverlayMediator ()
-// The confirmation config.
+@property(nonatomic, readonly) OverlayRequest* request;
 @property(nonatomic, readonly) JavaScriptPromptOverlayRequestConfig* config;
+
+// Sets the OverlayResponse using the user input |textInput| from the prompt UI.
+- (void)setPromptResponse:(NSString*)textInput;
 @end
 
 @implementation JavaScriptPromptOverlayMediator
 
+- (instancetype)initWithRequest:(OverlayRequest*)request {
+  if (self = [super init]) {
+    _request = request;
+    DCHECK(_request);
+    // Verify that the request is configured for JavaScript prompts.
+    DCHECK(_request->GetConfig<JavaScriptPromptOverlayRequestConfig>());
+  }
+  return self;
+}
+
 #pragma mark - Accessors
 
 - (JavaScriptPromptOverlayRequestConfig*)config {
   return self.request->GetConfig<JavaScriptPromptOverlayRequestConfig>();
 }
 
-- (void)setConsumer:(id<AlertConsumer>)consumer {
-  if (self.consumer == consumer)
-    return;
-  [super setConsumer:consumer];
-  [self.consumer setMessage:base::SysUTF8ToNSString(self.config->message())];
-  __weak __typeof__(self) weakSelf = self;
-  NSArray* actions = @[
-    [AlertAction actionWithTitle:l10n_util::GetNSString(IDS_OK)
-                           style:UIAlertActionStyleDefault
-                         handler:^(AlertAction* action) {
-                           __typeof__(self) strongSelf = weakSelf;
-                           NSString* input = [strongSelf.dataSource
-                               promptInputForMediator:strongSelf];
-                           [strongSelf setPromptResponse:input ? input : @""];
-                           [strongSelf.delegate
-                               stopDialogForMediator:strongSelf];
-                         }],
-    [AlertAction actionWithTitle:l10n_util::GetNSString(IDS_CANCEL)
-                           style:UIAlertActionStyleCancel
-                         handler:^(AlertAction* action) {
-                           [weakSelf.delegate stopDialogForMediator:weakSelf];
-                         }],
-  ];
-  AlertAction* blockingAction = GetBlockingAlertAction(self);
-  if (blockingAction)
-    actions = [actions arrayByAddingObject:blockingAction];
-  [self.consumer setActions:actions];
-
-  NSString* defaultPromptValue =
-      base::SysUTF8ToNSString(self.config->default_prompt_value());
-  [self.consumer setTextFieldConfigurations:@[
-    [[TextFieldConfiguration alloc]
-                   initWithText:defaultPromptValue
-                    placeholder:nil
-        accessibilityIdentifier:kJavaScriptPromptTextFieldAccessibiltyIdentifier
-                secureTextEntry:NO]
-  ]];
-}
-
 #pragma mark - Response helpers
 
-// Sets the OverlayResponse using the user input from the prompt UI.
 - (void)setPromptResponse:(NSString*)textInput {
   self.request->set_response(
       OverlayResponse::CreateWithInfo<JavaScriptPromptOverlayResponseInfo>(
@@ -91,12 +64,51 @@
 
 @implementation JavaScriptPromptOverlayMediator (Subclassing)
 
-- (const JavaScriptDialogSource&)requestSource {
-  return self.config->source();
+- (NSString*)alertTitle {
+  return GetJavaScriptDialogTitle(self.config->source(),
+                                  self.config->message());
 }
 
-- (const std::string&)requestMessage {
-  return self.config->message();
+- (NSString*)alertMessage {
+  return GetJavaScriptDialogMessage(self.config->source(),
+                                    self.config->message());
+}
+
+- (NSArray<TextFieldConfiguration*>*)alertTextFieldConfigurations {
+  NSString* defaultPromptValue =
+      base::SysUTF8ToNSString(self.config->default_prompt_value());
+  return @[ [[TextFieldConfiguration alloc]
+                 initWithText:defaultPromptValue
+                  placeholder:nil
+      accessibilityIdentifier:kJavaScriptPromptTextFieldAccessibiltyIdentifier
+              secureTextEntry:NO] ];
+}
+
+- (NSArray<AlertAction*>*)alertActions {
+  __weak __typeof__(self) weakSelf = self;
+  NSArray* actions = @[
+    [AlertAction actionWithTitle:l10n_util::GetNSString(IDS_OK)
+                           style:UIAlertActionStyleDefault
+                         handler:^(AlertAction* action) {
+                           __typeof__(self) strongSelf = weakSelf;
+                           NSString* input = [strongSelf.dataSource
+                               textFieldInputForMediator:strongSelf
+                                          textFieldIndex:0];
+                           [strongSelf setPromptResponse:input ? input : @""];
+                           [strongSelf.delegate
+                               stopDialogForMediator:strongSelf];
+                         }],
+    [AlertAction actionWithTitle:l10n_util::GetNSString(IDS_CANCEL)
+                           style:UIAlertActionStyleCancel
+                         handler:^(AlertAction* action) {
+                           [weakSelf.delegate stopDialogForMediator:weakSelf];
+                         }],
+  ];
+  AlertAction* blockingAction =
+      GetBlockingAlertAction(self, self.config->source());
+  if (blockingAction)
+    actions = [actions arrayByAddingObject:blockingAction];
+  return actions;
 }
 
 @end
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator_unittest.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator_unittest.mm
index dfacf8a0..b789af9a 100644
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_mediator_unittest.mm
@@ -14,8 +14,7 @@
 #import "ios/chrome/browser/ui/alert_view_controller/test/fake_alert_consumer.h"
 #import "ios/chrome/browser/ui/dialogs/java_script_dialog_blocking_state.h"
 #import "ios/chrome/browser/ui/elements/text_field_configuration.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_mediator_test.h"
+#import "ios/chrome/browser/ui/overlays/common/alerts/test/alert_overlay_mediator_test.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/web/public/test/fakes/test_web_state.h"
 #include "testing/gtest_mac.h"
@@ -32,20 +31,20 @@
 
 // Fake version of the mediator data source.
 @interface FakePromptOverlayMediatorDataSource
-    : NSObject <JavaScriptPromptOverlayMediatorDataSource>
+    : NSObject <AlertOverlayMediatorDataSource>
 @property(nonatomic, copy) NSString* promptInput;
 @end
 
 @implementation FakePromptOverlayMediatorDataSource
 
-- (NSString*)promptInputForMediator:(JavaScriptPromptOverlayMediator*)mediator {
+- (NSString*)textFieldInputForMediator:(AlertOverlayMediator*)mediator
+                        textFieldIndex:(NSUInteger)index {
   return self.promptInput;
 }
 
 @end
 
-class JavaScriptPromptOverlayMediatorTest
-    : public JavaScriptDialogOverlayMediatorTest {
+class JavaScriptPromptOverlayMediatorTest : public AlertOverlayMediatorTest {
  public:
   JavaScriptPromptOverlayMediatorTest()
       : url_("https://chromium.test"),
@@ -56,11 +55,11 @@
   }
 
   // Creates a mediator and sets it for testing.
-  void CreateMediator() {
+  void CreateMediator(bool is_main_frame = true) {
     request_ =
         OverlayRequest::CreateWithConfig<JavaScriptPromptOverlayRequestConfig>(
-            JavaScriptDialogSource(&web_state_, url_, /*is_main_frame=*/true),
-            message_, default_prompt_value_);
+            JavaScriptDialogSource(&web_state_, url_, is_main_frame), message_,
+            default_prompt_value_);
     JavaScriptPromptOverlayMediator* mediator =
         [[JavaScriptPromptOverlayMediator alloc]
             initWithRequest:request_.get()];
@@ -110,7 +109,7 @@
 
 // Tests that the consumer values are set correctly for prompts from iframes.
 TEST_F(JavaScriptPromptOverlayMediatorTest, PromptSetupIframe) {
-  CreateMediator();
+  CreateMediator(/*is_main_frame=*/false);
 
   // Verify the consumer values.
   EXPECT_NSEQ(base::SysUTF8ToNSString(message()), consumer().message);
@@ -134,7 +133,7 @@
   CreateMediator();
 
   // Verify the consumer values.
-  EXPECT_NSEQ(base::SysUTF8ToNSString(message()), consumer().message);
+  EXPECT_NSEQ(base::SysUTF8ToNSString(message()), consumer().title);
   ASSERT_EQ(1U, consumer().textFieldConfigurations.count);
   EXPECT_NSEQ(base::SysUTF8ToNSString(default_prompt_value()),
               consumer().textFieldConfigurations[0].text);
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/BUILD.gn b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/BUILD.gn
deleted file mode 100644
index 7bd4f42..0000000
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/BUILD.gn
+++ /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.
-
-source_set("test") {
-  testonly = true
-  sources = [
-    "java_script_dialog_overlay_coordinator_test.h",
-    "java_script_dialog_overlay_coordinator_test.mm",
-    "java_script_dialog_overlay_mediator_test.h",
-    "java_script_dialog_overlay_mediator_test.mm",
-  ]
-
-  configs += [ "//build/config/compiler:enable_arc" ]
-
-  deps = [
-    "//base/test:test_support",
-    "//ios/chrome/browser/browser_state:test_support",
-    "//ios/chrome/browser/main:test_support",
-    "//ios/chrome/browser/overlays",
-    "//ios/chrome/browser/overlays/public/web_content_area",
-    "//ios/chrome/browser/ui/alert_view_controller",
-    "//ios/chrome/browser/ui/alert_view_controller/test",
-    "//ios/chrome/browser/ui/overlays",
-    "//ios/chrome/browser/ui/overlays:coordinators",
-    "//ios/chrome/browser/ui/overlays/test",
-    "//ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs:alerts",
-    "//ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs:common",
-    "//ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs:confirmations",
-    "//ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs:prompts",
-    "//ios/chrome/browser/web_state_list",
-    "//ios/chrome/browser/web_state_list:test_support",
-    "//ios/chrome/test:test_support",
-    "//ios/web/public",
-    "//ios/web/public/test",
-    "//ios/web/public/test/fakes",
-    "//testing/gmock",
-    "//testing/gtest",
-  ]
-}
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_coordinator_test.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_coordinator_test.h
deleted file mode 100644
index 45c0c16d..0000000
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_coordinator_test.h
+++ /dev/null
@@ -1,65 +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 IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_TEST_JAVA_SCRIPT_DIALOG_OVERLAY_COORDINATOR_TEST_H_
-#define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_TEST_JAVA_SCRIPT_DIALOG_OVERLAY_COORDINATOR_TEST_H_
-
-#import <UIKit/UIKit.h>
-#include <memory>
-
-#import "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
-#import "ios/chrome/browser/main/test_browser.h"
-#import "ios/chrome/browser/overlays/public/overlay_request.h"
-#include "ios/chrome/browser/ui/overlays/test/fake_overlay_request_coordinator_delegate.h"
-#import "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h"
-#import "ios/chrome/browser/web_state_list/web_state_list.h"
-#import "ios/chrome/test/scoped_key_window.h"
-#include "ios/web/public/test/web_task_environment.h"
-#include "testing/platform_test.h"
-
-@class AlertViewController;
-class OverlayRequest;
-@class OverlayRequestCoordinator;
-
-// Test fixture for testing JavaScriptDialogOverlayCoordinator subclasses.
-class JavaScriptDialogOverlayCoordinatorTest : public PlatformTest {
- protected:
-  JavaScriptDialogOverlayCoordinatorTest();
-  ~JavaScriptDialogOverlayCoordinatorTest() override;
-
-  // Accessors:
-  const FakeOverlayRequestCoordinatorDelegate& delegate() const {
-    return delegate_;
-  }
-
-  // Sets the request for the test.  Setting to a new value will create a
-  // coordinator that will show the dialog UI for |request|.
-  void SetRequest(std::unique_ptr<OverlayRequest> request);
-
-  // Starts the coordinator for the provided request over
-  // |base_view_controller|'s presentation context.  Does nothing if
-  // SetRequest() has not yet been called.
-  void StartDialogCoordinator();
-
-  // Stops the coordinator for the provided request.  Does nothing if
-  // SetRequest() has not yet been called.
-  void StopDialogCoordinator();
-
-  // Returns the view controller showing the JavaScript dialog UI.
-  UIViewController* GetAlertViewController();
-
- private:
-  web::WebTaskEnvironment task_environment_;
-  ScopedKeyWindow scoped_key_window_;
-  FakeWebStateListDelegate web_state_list_delegate_;
-  WebStateList web_state_list_;
-  std::unique_ptr<TestChromeBrowserState> chrome_browser_state_;
-  std::unique_ptr<Browser> browser_;
-  UIViewController* base_view_controller;
-  std::unique_ptr<OverlayRequest> request_;
-  FakeOverlayRequestCoordinatorDelegate delegate_;
-  OverlayRequestCoordinator* coordinator_;
-};
-
-#endif  // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_TEST_JAVA_SCRIPT_DIALOG_OVERLAY_COORDINATOR_TEST_H_
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_coordinator_test.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_coordinator_test.mm
deleted file mode 100644
index 5deb3e3..0000000
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_coordinator_test.mm
+++ /dev/null
@@ -1,67 +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.
-
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_coordinator_test.h"
-
-#import "base/mac/foundation_util.h"
-#import "ios/chrome/browser/ui/alert_view_controller/alert_view_controller.h"
-#import "ios/chrome/browser/ui/overlays/overlay_coordinator_factory+initialization.h"
-#import "ios/chrome/browser/ui/overlays/overlay_request_coordinator.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_alert_overlay_coordinator.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_confirmation_overlay_coordinator.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_prompt_overlay_coordinator.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-JavaScriptDialogOverlayCoordinatorTest::JavaScriptDialogOverlayCoordinatorTest()
-    : PlatformTest(),
-      web_state_list_(&web_state_list_delegate_),
-      base_view_controller([[UIViewController alloc] init]) {
-  // Set up the TestBrowser.
-  TestChromeBrowserState::Builder browser_state_builder;
-  chrome_browser_state_ = browser_state_builder.Build();
-  browser_ = std::make_unique<TestBrowser>(chrome_browser_state_.get(),
-                                           &web_state_list_);
-  // Set up the view hierarchy for testing.
-  base_view_controller.definesPresentationContext = YES;
-  [scoped_key_window_.Get() setRootViewController:base_view_controller];
-}
-
-JavaScriptDialogOverlayCoordinatorTest::
-    ~JavaScriptDialogOverlayCoordinatorTest() = default;
-
-void JavaScriptDialogOverlayCoordinatorTest::SetRequest(
-    std::unique_ptr<OverlayRequest> request) {
-  DCHECK(!request_);
-  DCHECK(request);
-  request_ = std::move(request);
-  NSArray<Class>* coordinator_classes =
-      @ [[JavaScriptAlertOverlayCoordinator class],
-         [JavaScriptConfirmationOverlayCoordinator class],
-         [JavaScriptPromptOverlayCoordinator class]];
-  OverlayRequestCoordinatorFactory* factory =
-      [[OverlayRequestCoordinatorFactory alloc]
-                                    initWithBrowser:browser_.get()
-          supportedOverlayRequestCoordinatorClasses:coordinator_classes];
-  coordinator_ = [factory newCoordinatorForRequest:request_.get()
-                                          delegate:&delegate_
-                                baseViewController:base_view_controller];
-}
-
-void JavaScriptDialogOverlayCoordinatorTest::StartDialogCoordinator() {
-  DCHECK(coordinator_);
-  [coordinator_ startAnimated:NO];
-}
-
-void JavaScriptDialogOverlayCoordinatorTest::StopDialogCoordinator() {
-  DCHECK(coordinator_);
-  [coordinator_ stopAnimated:NO];
-}
-
-UIViewController*
-JavaScriptDialogOverlayCoordinatorTest::GetAlertViewController() {
-  return coordinator_.viewController;
-}
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_mediator_test.h b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_mediator_test.h
deleted file mode 100644
index 73685817..0000000
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_mediator_test.h
+++ /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.
-
-#ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_TEST_JAVA_SCRIPT_DIALOG_OVERLAY_MEDIATOR_TEST_H_
-#define IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_TEST_JAVA_SCRIPT_DIALOG_OVERLAY_MEDIATOR_TEST_H_
-
-#include <memory>
-
-#include "testing/platform_test.h"
-
-@class FakeAlertConsumer;
-@class JavaScriptDialogOverlayMediator;
-
-// Test fixture for testing JavaScriptDialogOverlayMediator subclasses.
-class JavaScriptDialogOverlayMediatorTest : public PlatformTest {
- protected:
-  JavaScriptDialogOverlayMediatorTest();
-  ~JavaScriptDialogOverlayMediatorTest() override;
-
-  // Accessors:
-  FakeAlertConsumer* consumer() { return consumer_; }
-
-  // Setter for the mediator.  Upon being set, |consumer_| will be updated with
-  // the new value.
-  void SetMediator(JavaScriptDialogOverlayMediator* mediator);
-
- private:
-  FakeAlertConsumer* consumer_ = nil;
-  JavaScriptDialogOverlayMediator* mediator_ = nil;
-};
-
-#endif  // IOS_CHROME_BROWSER_UI_OVERLAYS_WEB_CONTENT_AREA_JAVA_SCRIPT_DIALOGS_TEST_JAVA_SCRIPT_DIALOG_OVERLAY_MEDIATOR_TEST_H_
diff --git a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_mediator_test.mm b/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_mediator_test.mm
deleted file mode 100644
index 267fe6d..0000000
--- a/ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_mediator_test.mm
+++ /dev/null
@@ -1,28 +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.
-
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/test/java_script_dialog_overlay_mediator_test.h"
-
-#include "base/logging.h"
-#import "ios/chrome/browser/ui/alert_view_controller/test/fake_alert_consumer.h"
-#import "ios/chrome/browser/ui/overlays/web_content_area/java_script_dialogs/java_script_dialog_overlay_mediator.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-JavaScriptDialogOverlayMediatorTest::JavaScriptDialogOverlayMediatorTest()
-    : PlatformTest(), consumer_([[FakeAlertConsumer alloc] init]) {}
-
-JavaScriptDialogOverlayMediatorTest::~JavaScriptDialogOverlayMediatorTest() =
-    default;
-
-void JavaScriptDialogOverlayMediatorTest::SetMediator(
-    JavaScriptDialogOverlayMediator* mediator) {
-  if (mediator_ == mediator)
-    return;
-  mediator_.consumer = nil;
-  mediator_ = mediator;
-  mediator_.consumer = consumer_;
-}
diff --git a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm
index 5829e04..0ea5d9d8 100644
--- a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm
+++ b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm
@@ -32,8 +32,6 @@
 #error "This file requires ARC support."
 #endif
 
-using fullscreen::features::ViewportAdjustmentExperiment;
-
 namespace {
 // This enum is used to record the overscroll actions performed by the user on
 // the histogram named |OverscrollActions|.
@@ -571,12 +569,9 @@
 - (BOOL)viewportAdjustsContentInset {
   if (_webViewProxy.shouldUseViewContentInset)
     return YES;
-  ViewportAdjustmentExperiment experiment =
-      fullscreen::features::GetActiveViewportExperiment();
-  return experiment == ViewportAdjustmentExperiment::SMOOTH_SCROLLING &&
-         ios::GetChromeBrowserProvider()
-             ->GetFullscreenProvider()
-             ->IsInitialized();
+  return ios::GetChromeBrowserProvider()
+      ->GetFullscreenProvider()
+      ->IsInitialized();
 }
 
 - (void)recordMetricForTriggeredAction:(OverscrollAction)action {
diff --git a/ios/web_view/internal/cwv_web_view_configuration.mm b/ios/web_view/internal/cwv_web_view_configuration.mm
index 57969ad..ac84afb 100644
--- a/ios/web_view/internal/cwv_web_view_configuration.mm
+++ b/ios/web_view/internal/cwv_web_view_configuration.mm
@@ -19,9 +19,7 @@
 #import "ios/web_view/internal/cwv_user_content_controller_internal.h"
 #import "ios/web_view/internal/cwv_web_view_internal.h"
 #include "ios/web_view/internal/passwords/web_view_password_store_factory.h"
-#include "ios/web_view/internal/signin/ios_web_view_signin_client.h"
 #include "ios/web_view/internal/signin/web_view_identity_manager_factory.h"
-#include "ios/web_view/internal/signin/web_view_signin_client_factory.h"
 #include "ios/web_view/internal/signin/web_view_signin_error_controller_factory.h"
 #import "ios/web_view/internal/sync/cwv_sync_controller_internal.h"
 #import "ios/web_view/internal/sync/web_view_profile_sync_service_factory.h"
@@ -162,18 +160,15 @@
     SigninErrorController* signinErrorController =
         ios_web_view::WebViewSigninErrorControllerFactory::GetForBrowserState(
             self.browserState);
+    autofill::PersonalDataManager* personalDataManager =
+        ios_web_view::WebViewPersonalDataManagerFactory::GetForBrowserState(
+            self.browserState);
 
     _syncController =
         [[CWVSyncController alloc] initWithSyncService:syncService
                                        identityManager:identityManager
-                                 signinErrorController:signinErrorController];
-
-    // Set the newly created CWVSyncController on IOSWebViewSigninClient to
-    // so access tokens can be fetched.
-    IOSWebViewSigninClient* signinClient =
-        ios_web_view::WebViewSigninClientFactory::GetForBrowserState(
-            self.browserState);
-    signinClient->SetSyncController(_syncController);
+                                 signinErrorController:signinErrorController
+                                   personalDataManager:personalDataManager];
   }
   return _syncController;
 }
diff --git a/ios/web_view/internal/signin/ios_web_view_signin_client.h b/ios/web_view/internal/signin/ios_web_view_signin_client.h
index e3bcd766..d6676df 100644
--- a/ios/web_view/internal/signin/ios_web_view_signin_client.h
+++ b/ios/web_view/internal/signin/ios_web_view_signin_client.h
@@ -15,8 +15,6 @@
 #include "net/cookies/cookie_change_dispatcher.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
-@class CWVSyncController;
-
 namespace ios_web_view {
 class WebViewBrowserState;
 }
@@ -54,10 +52,6 @@
       GaiaAuthConsumer* consumer,
       gaia::GaiaSource source) override;
 
-  // CWVSyncController setter/getter.
-  void SetSyncController(CWVSyncController* sync_controller);
-  CWVSyncController* GetSyncController() const;
-
  private:
   // Helper to delay callbacks until connection becomes online again.
   std::unique_ptr<WaitForNetworkCallbackHelper> network_callback_helper_;
@@ -68,10 +62,6 @@
   scoped_refptr<content_settings::CookieSettings> cookie_settings_;
   // Used to add and remove content settings observers.
   scoped_refptr<HostContentSettingsMap> host_content_settings_map_;
-  // Used by WebViewDeviceAccountsProviderImpl to fetch access
-  // tokens. Also used to notify of signout events. Held weak so this class
-  // does not determine |sync_controller_|'s lifetime.
-  __weak CWVSyncController* sync_controller_ = nil;
 
   DISALLOW_COPY_AND_ASSIGN(IOSWebViewSigninClient);
 };
diff --git a/ios/web_view/internal/signin/ios_web_view_signin_client.mm b/ios/web_view/internal/signin/ios_web_view_signin_client.mm
index 186da039..d79495d0 100644
--- a/ios/web_view/internal/signin/ios_web_view_signin_client.mm
+++ b/ios/web_view/internal/signin/ios_web_view_signin_client.mm
@@ -6,7 +6,6 @@
 
 #include "components/signin/core/browser/cookie_settings_util.h"
 #include "google_apis/gaia/gaia_auth_fetcher.h"
-#import "ios/web_view/internal/sync/cwv_sync_controller_internal.h"
 #include "ios/web_view/internal/web_view_browser_state.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
@@ -70,7 +69,6 @@
     base::OnceCallback<void(SignoutDecision)> on_signout_decision_reached,
     signin_metrics::ProfileSignout signout_source_metric) {
   std::move(on_signout_decision_reached).Run(SignoutDecision::ALLOW_SIGNOUT);
-  [sync_controller_ didSignoutWithSourceMetric:signout_source_metric];
 }
 
 void IOSWebViewSigninClient::DelayNetworkCall(base::OnceClosure callback) {
@@ -84,11 +82,3 @@
                                            GetURLLoaderFactory());
 }
 
-void IOSWebViewSigninClient::SetSyncController(
-    CWVSyncController* sync_controller) {
-  sync_controller_ = sync_controller;
-}
-
-CWVSyncController* IOSWebViewSigninClient::GetSyncController() const {
-  return sync_controller_;
-}
diff --git a/ios/web_view/internal/signin/web_view_device_accounts_provider_impl.h b/ios/web_view/internal/signin/web_view_device_accounts_provider_impl.h
index 38f439fb..0285539 100644
--- a/ios/web_view/internal/signin/web_view_device_accounts_provider_impl.h
+++ b/ios/web_view/internal/signin/web_view_device_accounts_provider_impl.h
@@ -12,14 +12,10 @@
 #include "base/macros.h"
 #include "components/signin/public/identity_manager/ios/device_accounts_provider.h"
 
-class IOSWebViewSigninClient;
-
 // Implementation of DeviceAccountsProvider.
 class WebViewDeviceAccountsProviderImpl : public DeviceAccountsProvider {
  public:
-  // |signin_client| used to fetch access tokens.
-  explicit WebViewDeviceAccountsProviderImpl(
-      IOSWebViewSigninClient* signin_client);
+  WebViewDeviceAccountsProviderImpl();
   ~WebViewDeviceAccountsProviderImpl() override;
 
   // ios::DeviceAccountsProvider
@@ -33,9 +29,6 @@
       NSError* error) const override;
 
  private:
-  // Used to obtain access tokens in |GetAccessToken|.
-  IOSWebViewSigninClient* const signin_client_ = nullptr;
-
   DISALLOW_COPY_AND_ASSIGN(WebViewDeviceAccountsProviderImpl);
 };
 
diff --git a/ios/web_view/internal/signin/web_view_device_accounts_provider_impl.mm b/ios/web_view/internal/signin/web_view_device_accounts_provider_impl.mm
index e611608..89127ab 100644
--- a/ios/web_view/internal/signin/web_view_device_accounts_provider_impl.mm
+++ b/ios/web_view/internal/signin/web_view_device_accounts_provider_impl.mm
@@ -6,17 +6,16 @@
 
 #include "base/logging.h"
 #include "base/strings/sys_string_conversions.h"
-#include "ios/web_view/internal/signin/ios_web_view_signin_client.h"
 #import "ios/web_view/internal/sync/cwv_sync_controller_internal.h"
 #import "ios/web_view/public/cwv_identity.h"
+#import "ios/web_view/public/cwv_sync_controller_data_source.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
-WebViewDeviceAccountsProviderImpl::WebViewDeviceAccountsProviderImpl(
-    IOSWebViewSigninClient* signin_client)
-    : signin_client_(signin_client) {}
+WebViewDeviceAccountsProviderImpl::WebViewDeviceAccountsProviderImpl() =
+    default;
 
 WebViewDeviceAccountsProviderImpl::~WebViewDeviceAccountsProviderImpl() =
     default;
@@ -26,27 +25,42 @@
     const std::string& client_id,
     const std::set<std::string>& scopes,
     AccessTokenCallback callback) {
-  // |sync_controller| may still be nil if this is called too early so
-  // |callback| will not be invoked. That's OK because this will be called again
-  // after |sync_controller| has been set.
-  CWVSyncController* sync_controller = signin_client_->GetSyncController();
-  [sync_controller fetchAccessTokenForScopes:scopes
-                                    callback:std::move(callback)];
+  NSMutableArray<NSString*>* scopes_array = [NSMutableArray array];
+  for (const auto& scope : scopes) {
+    [scopes_array addObject:base::SysUTF8ToNSString(scope)];
+  }
+
+  // AccessTokenCallback is non-copyable. Using __block allocates the memory
+  // directly in the block object at compilation time (instead of doing a
+  // copy). This is required to have correct interaction between move-only
+  // types and Objective-C blocks.
+  __block AccessTokenCallback scoped_callback = std::move(callback);
+  CWVIdentity* identity =
+      [[CWVIdentity alloc] initWithEmail:nil
+                                fullName:nil
+                                  gaiaID:base::SysUTF8ToNSString(gaia_id)];
+  [CWVSyncController.dataSource
+      fetchAccessTokenForIdentity:identity
+                           scopes:scopes_array
+                completionHandler:^(NSString* access_token,
+                                    NSDate* expiration_date, NSError* error) {
+                  std::move(scoped_callback)
+                      .Run(access_token, expiration_date, error);
+                }];
 }
 
 std::vector<DeviceAccountsProvider::AccountInfo>
 WebViewDeviceAccountsProviderImpl::GetAllAccounts() const {
-  // |sync_controller| may still be nil if this is called too early. That's OK
-  // because this will be called again after it has been set.
-  CWVSyncController* sync_controller = signin_client_->GetSyncController();
-  CWVIdentity* current_identity = sync_controller.currentIdentity;
-  if (current_identity) {
+  NSArray<CWVIdentity*>* identities =
+      [CWVSyncController.dataSource allKnownIdentities];
+  std::vector<AccountInfo> account_infos;
+  for (CWVIdentity* identity in identities) {
     AccountInfo account_info;
-    account_info.email = base::SysNSStringToUTF8(current_identity.email);
-    account_info.gaia = base::SysNSStringToUTF8(current_identity.gaiaID);
-    return {account_info};
+    account_info.email = base::SysNSStringToUTF8(identity.email);
+    account_info.gaia = base::SysNSStringToUTF8(identity.gaiaID);
+    account_infos.push_back(account_info);
   }
-  return {};
+  return account_infos;
 }
 
 AuthenticationErrorCategory
diff --git a/ios/web_view/internal/signin/web_view_identity_manager_factory.mm b/ios/web_view/internal/signin/web_view_identity_manager_factory.mm
index 4f210a5..ed8972ba 100644
--- a/ios/web_view/internal/signin/web_view_identity_manager_factory.mm
+++ b/ios/web_view/internal/signin/web_view_identity_manager_factory.mm
@@ -61,22 +61,16 @@
   WebViewBrowserState* browser_state =
       WebViewBrowserState::FromBrowserState(context);
 
-  // Clearing the sign in state on start up greatly simplifies the management of
-  // ChromeWebView's signin state.
-  PrefService* pref_service = browser_state->GetPrefs();
-  pref_service->ClearPref(prefs::kGoogleServicesAccountId);
-  pref_service->ClearPref(prefs::kGoogleServicesConsentedToSync);
-
   IOSWebViewSigninClient* client =
       WebViewSigninClientFactory::GetForBrowserState(browser_state);
 
   signin::IdentityManagerBuildParams params;
   params.account_consistency = signin::AccountConsistencyMethod::kDisabled;
   params.device_accounts_provider =
-      std::make_unique<WebViewDeviceAccountsProviderImpl>(client);
+      std::make_unique<WebViewDeviceAccountsProviderImpl>();
   params.image_decoder = image_fetcher::CreateIOSImageDecoder();
   params.local_state = ApplicationContext::GetInstance()->GetLocalState();
-  params.pref_service = pref_service;
+  params.pref_service = browser_state->GetPrefs();
   params.profile_path = base::FilePath();
   params.signin_client = client;
 
diff --git a/ios/web_view/internal/sync/cwv_sync_controller.mm b/ios/web_view/internal/sync/cwv_sync_controller.mm
index f8f5462..33f7586 100644
--- a/ios/web_view/internal/sync/cwv_sync_controller.mm
+++ b/ios/web_view/internal/sync/cwv_sync_controller.mm
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "base/strings/sys_string_conversions.h"
+#include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/signin/core/browser/signin_error_controller.h"
 #include "components/signin/public/identity_manager/account_info.h"
 #include "components/signin/public/identity_manager/device_accounts_synchronizer.h"
@@ -24,8 +25,6 @@
 #error "This file requires ARC support."
 #endif
 
-using AccessTokenCallback = DeviceAccountsProvider::AccessTokenCallback;
-
 NSErrorDomain const CWVSyncErrorDomain =
     @"org.chromium.chromewebview.SyncErrorDomain";
 
@@ -65,6 +64,8 @@
 - (void)didShutdownSync;
 // Called by WebViewSyncControllerObserverBridge's |OnErrorChanged|.
 - (void)didUpdateAuthError;
+// Called by WebViewSyncControllerObserverBridge's |OnPrimaryAccountCleared|.
+- (void)didClearPrimaryAccount;
 
 // Call to refresh access tokens for |currentIdentity|.
 - (void)reloadCredentials;
@@ -77,6 +78,7 @@
 // methods on CWVSyncController.
 class WebViewSyncControllerObserverBridge
     : public syncer::SyncServiceObserver,
+      public signin::IdentityManager::Observer,
       public SigninErrorController::Observer {
  public:
   explicit WebViewSyncControllerObserverBridge(
@@ -92,6 +94,12 @@
     [sync_controller_ didShutdownSync];
   }
 
+  // signin::IdentityManager::Observer
+  void OnPrimaryAccountCleared(
+      const CoreAccountInfo& previous_primary_account_info) override {
+    [sync_controller_ didClearPrimaryAccount];
+  }
+
   // SigninErrorController::Observer:
   void OnErrorChanged() override { [sync_controller_ didUpdateAuthError]; }
 
@@ -106,29 +114,51 @@
   signin::IdentityManager* _identityManager;
   SigninErrorController* _signinErrorController;
   std::unique_ptr<ios_web_view::WebViewSyncControllerObserverBridge> _observer;
-
-  // Data source that can provide access tokens.
-  __weak id<CWVSyncControllerDataSource> _dataSource;
+  autofill::PersonalDataManager* _personalDataManager;
 }
 
-@synthesize delegate = _delegate;
 @synthesize currentIdentity = _currentIdentity;
+@synthesize delegate = _delegate;
 
-- (instancetype)initWithSyncService:(syncer::SyncService*)syncService
-                    identityManager:(signin::IdentityManager*)identityManager
-              signinErrorController:
-                  (SigninErrorController*)signinErrorController {
+namespace {
+// Data source that can provide access tokens.
+__weak id<CWVSyncControllerDataSource> gSyncDataSource;
+}
+
++ (void)setDataSource:(id<CWVSyncControllerDataSource>)dataSource {
+  gSyncDataSource = dataSource;
+}
+
++ (id<CWVSyncControllerDataSource>)dataSource {
+  return gSyncDataSource;
+}
+
+- (instancetype)
+      initWithSyncService:(syncer::SyncService*)syncService
+          identityManager:(signin::IdentityManager*)identityManager
+    signinErrorController:(SigninErrorController*)signinErrorController
+      personalDataManager:(autofill::PersonalDataManager*)personalDataManager {
   self = [super init];
   if (self) {
     _syncService = syncService;
     _identityManager = identityManager;
     _signinErrorController = signinErrorController;
+    _personalDataManager = personalDataManager;
     _observer =
         std::make_unique<ios_web_view::WebViewSyncControllerObserverBridge>(
             self);
     _syncService->AddObserver(_observer.get());
+    _identityManager->AddObserver(_observer.get());
     _signinErrorController->AddObserver(_observer.get());
 
+    if (_identityManager->HasPrimaryAccount()) {
+      CoreAccountInfo accountInfo = _identityManager->GetPrimaryAccountInfo();
+      _currentIdentity = [[CWVIdentity alloc]
+          initWithEmail:base::SysUTF8ToNSString(accountInfo.email)
+               fullName:nil
+                 gaiaID:base::SysUTF8ToNSString(accountInfo.gaia)];
+    }
+
     // Refresh access tokens on foreground to extend expiration dates.
     [[NSNotificationCenter defaultCenter]
         addObserver:self
@@ -141,6 +171,7 @@
 
 - (void)dealloc {
   _syncService->RemoveObserver(_observer.get());
+  _identityManager->RemoveObserver(_observer.get());
   _signinErrorController->RemoveObserver(_observer.get());
 }
 
@@ -150,18 +181,16 @@
   return _syncService->GetUserSettings()->IsPassphraseRequiredForDecryption();
 }
 
-- (void)startSyncWithIdentity:(CWVIdentity*)identity
-                   dataSource:
-                       (__weak id<CWVSyncControllerDataSource>)dataSource {
-  DCHECK(!_dataSource);
-  DCHECK(!_currentIdentity);
+- (BOOL)isConsentNeeded {
+  return !_syncService->GetUserSettings()->IsFirstSetupComplete();
+}
 
-  _dataSource = dataSource;
+- (void)startSyncWithIdentity:(CWVIdentity*)identity {
+  DCHECK(!_currentIdentity)
+      << "Already syncing! Call -stopSyncAndClearIdentity first.";
+
   _currentIdentity = identity;
 
-  DCHECK(_dataSource);
-  DCHECK(_currentIdentity);
-
   const CoreAccountId accountId = _identityManager->PickAccountIdForAccount(
       base::SysNSStringToUTF8(identity.gaiaID),
       base::SysNSStringToUTF8(identity.email));
@@ -172,16 +201,23 @@
 
   _identityManager->GetPrimaryAccountMutator()->SetPrimaryAccount(accountId);
   CHECK_EQ(_identityManager->GetPrimaryAccountId(), accountId);
+
+  _syncService->GetUserSettings()->SetSyncRequested(true);
 }
 
 - (void)stopSyncAndClearIdentity {
+  _syncService->StopAndClear();
+
   auto* primaryAccountMutator = _identityManager->GetPrimaryAccountMutator();
   primaryAccountMutator->ClearPrimaryAccount(
       signin::PrimaryAccountMutator::ClearAccountsAction::kDefault,
       signin_metrics::ProfileSignout::USER_CLICKED_SIGNOUT_SETTINGS,
       signin_metrics::SignoutDelete::IGNORE_METRIC);
+
+  // Clear all local data because we do not support data migration.
+  _personalDataManager->ClearAllLocalData();
+
   _currentIdentity = nil;
-  _dataSource = nil;
 }
 
 - (BOOL)unlockWithPassphrase:(NSString*)passphrase {
@@ -189,6 +225,11 @@
       base::SysNSStringToUTF8(passphrase));
 }
 
+- (void)consent {
+  _syncService->GetUserSettings()->SetFirstSetupComplete(
+      syncer::SyncFirstSetupCompleteSource::BASIC_FLOW);
+}
+
 #pragma mark - Private Methods
 
 - (void)didCompleteSyncConfiguration {
@@ -203,50 +244,17 @@
 }
 
 - (void)reloadCredentials {
-  if (_currentIdentity != nil) {
-    _identityManager->GetDeviceAccountsSynchronizer()
-        ->ReloadAllAccountsFromSystem();
-  }
+  _identityManager->GetDeviceAccountsSynchronizer()
+      ->ReloadAllAccountsFromSystem();
 }
 
 #pragma mark - Internal Methods
 
-- (void)fetchAccessTokenForScopes:(const std::set<std::string>&)scopes
-                         callback:(AccessTokenCallback)callback {
-  DCHECK(!callback.is_null());
-  NSMutableArray<NSString*>* scopesArray = [NSMutableArray array];
-  for (const auto& scope : scopes) {
-    [scopesArray addObject:base::SysUTF8ToNSString(scope)];
-  }
-
-  // AccessTokenCallback is non-copyable. Using __block allocates the memory
-  // directly in the block object at compilation time (instead of doing a
-  // copy). This is required to have correct interaction between move-only
-  // types and Objective-C blocks.
-  __block AccessTokenCallback scopedCallback = std::move(callback);
-  [_dataSource syncController:self
-      getAccessTokenForScopes:[scopesArray copy]
-            completionHandler:^(NSString* accessToken, NSDate* expirationDate,
-                                NSError* error) {
-              std::move(scopedCallback).Run(accessToken, expirationDate, error);
-            }];
-}
-
-- (void)didSignoutWithSourceMetric:(signin_metrics::ProfileSignout)metric {
-  if (![_delegate respondsToSelector:@selector
-                  (syncController:didStopSyncWithReason:)]) {
+- (void)didClearPrimaryAccount {
+  if (![_delegate respondsToSelector:@selector(syncControllerDidStopSync:)]) {
     return;
   }
-  CWVStopSyncReason reason;
-  if (metric == signin_metrics::ProfileSignout::USER_CLICKED_SIGNOUT_SETTINGS) {
-    reason = CWVStopSyncReasonClient;
-  } else if (metric == signin_metrics::ProfileSignout::SERVER_FORCED_DISABLE) {
-    reason = CWVStopSyncReasonServer;
-  } else {
-    NOTREACHED();
-    return;
-  }
-  [_delegate syncController:self didStopSyncWithReason:reason];
+  [_delegate syncControllerDidStopSync:self];
 }
 
 - (void)didUpdateAuthError {
diff --git a/ios/web_view/internal/sync/cwv_sync_controller_internal.h b/ios/web_view/internal/sync/cwv_sync_controller_internal.h
index b9c08a44..679131f 100644
--- a/ios/web_view/internal/sync/cwv_sync_controller_internal.h
+++ b/ios/web_view/internal/sync/cwv_sync_controller_internal.h
@@ -5,15 +5,14 @@
 #ifndef IOS_WEB_VIEW_INTERNAL_SYNC_CWV_SYNC_CONTROLLER_INTERNAL_H_
 #define IOS_WEB_VIEW_INTERNAL_SYNC_CWV_SYNC_CONTROLLER_INTERNAL_H_
 
-#include <set>
-
-#include "components/signin/public/base/signin_metrics.h"
-#include "google_apis/gaia/google_service_auth_error.h"
-#include "ios/web_view/internal/signin/web_view_device_accounts_provider_impl.h"
 #import "ios/web_view/public/cwv_sync_controller.h"
 
 NS_ASSUME_NONNULL_BEGIN
 
+namespace autofill {
+class PersonalDataManager;
+}  // autofill
+
 namespace syncer {
 class SyncService;
 }  // namespace syncer
@@ -27,21 +26,13 @@
 @interface CWVSyncController ()
 
 // All dependencies must out live this class.
-- (instancetype)initWithSyncService:(syncer::SyncService*)syncService
-                    identityManager:(signin::IdentityManager*)identityManager
-              signinErrorController:
-                  (SigninErrorController*)SigninErrorController
+- (instancetype)
+      initWithSyncService:(syncer::SyncService*)syncService
+          identityManager:(signin::IdentityManager*)identityManager
+    signinErrorController:(SigninErrorController*)signinErrorController
+      personalDataManager:(autofill::PersonalDataManager*)personalDataManager
     NS_DESIGNATED_INITIALIZER;
 
-// Called by WebViewDeviceAccountsProviderImpl to obtain
-// access tokens for |scopes| to be passed back in |callback|.
-- (void)fetchAccessTokenForScopes:(const std::set<std::string>&)scopes
-                         callback:(DeviceAccountsProvider::AccessTokenCallback)
-                                      callback;
-
-// Called by IOSWebViewSigninClient when signing out.
-- (void)didSignoutWithSourceMetric:(signin_metrics::ProfileSignout)metric;
-
 @end
 
 NS_ASSUME_NONNULL_END
diff --git a/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm b/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm
index eab3c1b5..d9c1d2a62 100644
--- a/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm
+++ b/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm
@@ -11,9 +11,12 @@
 #include "base/callback.h"
 #include "base/files/file_path.h"
 #include "base/test/bind_test_util.h"
+#include "components/autofill/core/browser/test_personal_data_manager.h"
 #include "components/signin/core/browser/signin_error_controller.h"
 #include "components/signin/public/base/account_consistency_method.h"
+#include "components/signin/public/base/signin_pref_names.h"
 #include "components/signin/public/identity_manager/identity_test_utils.h"
+#include "components/signin/public/identity_manager/primary_account_mutator.h"
 #include "components/sync/driver/mock_sync_service.h"
 #include "components/sync/driver/sync_service_observer.h"
 #include "google_apis/gaia/google_service_auth_error.h"
@@ -21,6 +24,7 @@
 #include "ios/web/public/test/web_task_environment.h"
 #include "ios/web_view/internal/app/application_context.h"
 #include "ios/web_view/internal/signin/ios_web_view_signin_client.h"
+#include "ios/web_view/internal/signin/web_view_device_accounts_provider_impl.h"
 #include "ios/web_view/internal/signin/web_view_identity_manager_factory.h"
 #include "ios/web_view/internal/signin/web_view_signin_client_factory.h"
 #include "ios/web_view/internal/signin/web_view_signin_error_controller_factory.h"
@@ -64,23 +68,31 @@
 class CWVSyncControllerTest : public TestWithLocaleAndResources {
  protected:
   CWVSyncControllerTest() : browser_state_(/*off_the_record=*/false) {
+    // Clear account info before each test.
+    PrefService* pref_service = browser_state_.GetPrefs();
+    pref_service->ClearPref(prefs::kGoogleServicesAccountId);
+    pref_service->ClearPref(prefs::kGoogleServicesConsentedToSync);
+    pref_service->ClearPref(prefs::kAccountInfo);
+
     WebViewProfileSyncServiceFactory::GetInstance()->SetTestingFactory(
         &browser_state_, base::BindRepeating(&BuildMockSyncService));
 
     EXPECT_CALL(*mock_sync_service(), AddObserver(_))
         .WillOnce(Invoke(this, &CWVSyncControllerTest::AddObserver));
 
+    personal_data_manager_ =
+        std::make_unique<autofill::TestPersonalDataManager>();
+
     sync_controller_ = [[CWVSyncController alloc]
           initWithSyncService:mock_sync_service()
               identityManager:identity_manager()
-        signinErrorController:signin_error_controller()];
-
-    WebViewSigninClientFactory::GetForBrowserState(&browser_state_)
-        ->SetSyncController(sync_controller_);
+        signinErrorController:signin_error_controller()
+          personalDataManager:personal_data_manager_.get()];
   }
 
   ~CWVSyncControllerTest() override {
     EXPECT_CALL(*mock_sync_service(), RemoveObserver(_));
+    EXPECT_CALL(*mock_sync_service(), Shutdown());
   }
 
   void AddObserver(syncer::SyncServiceObserver* observer) {
@@ -103,6 +115,7 @@
 
   web::WebTaskEnvironment task_environment_;
   ios_web_view::WebViewBrowserState browser_state_;
+  std::unique_ptr<autofill::TestPersonalDataManager> personal_data_manager_;
   CWVSyncController* sync_controller_ = nil;
   syncer::SyncServiceObserver* sync_service_observer_ = nullptr;
 };
@@ -114,23 +127,23 @@
   // destroyed before this test exits to avoid holding on to |sync_controller_|.
   @autoreleasepool {
     id data_source = OCMProtocolMock(@protocol(CWVSyncControllerDataSource));
-
+    CWVSyncController.dataSource = data_source;
     [[data_source expect]
-                 syncController:sync_controller_
-        getAccessTokenForScopes:[OCMArg checkWithBlock:^BOOL(NSArray* scopes) {
-          return [scopes containsObject:@(kTestScope1)] &&
-                 [scopes containsObject:@(kTestScope2)];
+        fetchAccessTokenForIdentity:[OCMArg checkWithBlock:^BOOL(
+                                                CWVIdentity* identity) {
+          return [identity.gaiaID isEqualToString:@(kTestGaiaId)];
         }]
-              completionHandler:[OCMArg any]];
+                             scopes:[OCMArg checkWithBlock:^BOOL(
+                                                NSArray* scopes) {
+                               return [scopes containsObject:@(kTestScope1)] &&
+                                      [scopes containsObject:@(kTestScope2)];
+                             }]
+                  completionHandler:[OCMArg any]];
 
-    CWVIdentity* identity = [[CWVIdentity alloc] initWithEmail:@(kTestEmail)
-                                                      fullName:@(kTestFullName)
-                                                        gaiaID:@(kTestGaiaId)];
-    [sync_controller_ startSyncWithIdentity:identity dataSource:data_source];
-
+    WebViewDeviceAccountsProviderImpl accounts_provider;
     std::set<std::string> scopes = {kTestScope1, kTestScope2};
-    [sync_controller_ fetchAccessTokenForScopes:scopes
-                                       callback:base::DoNothing()];
+    accounts_provider.GetAccessToken(kTestGaiaId, "dummy-client-id", scopes,
+                                     base::DoNothing());
 
     [data_source verify];
   }
@@ -142,8 +155,15 @@
   // [delegate expect] returns an autoreleased object, but it must be destroyed
   // before this test exits to avoid holding on to |sync_controller_|.
   @autoreleasepool {
+    CWVIdentity* identity = [[CWVIdentity alloc] initWithEmail:@(kTestEmail)
+                                                      fullName:@(kTestFullName)
+                                                        gaiaID:@(kTestGaiaId)];
+    id data_source = OCMProtocolMock(@protocol(CWVSyncControllerDataSource));
+    [[[data_source stub] andReturn:@[ identity ]] allKnownIdentities];
+    CWVSyncController.dataSource = data_source;
     id delegate = OCMProtocolMock(@protocol(CWVSyncControllerDelegate));
     sync_controller_.delegate = delegate;
+    [sync_controller_ startSyncWithIdentity:identity];
 
     [[delegate expect] syncControllerDidStartSync:sync_controller_];
     sync_service_observer_->OnSyncConfigurationCompleted(mock_sync_service());
@@ -153,13 +173,6 @@
           return error.code == CWVSyncErrorInvalidGAIACredentials;
         }]];
 
-    id data_source = OCMProtocolMock(@protocol(CWVSyncControllerDataSource));
-
-    CWVIdentity* identity = [[CWVIdentity alloc] initWithEmail:@(kTestEmail)
-                                                      fullName:@(kTestFullName)
-                                                        gaiaID:@(kTestGaiaId)];
-    [sync_controller_ startSyncWithIdentity:identity dataSource:data_source];
-
     // Create authentication error.
     GoogleServiceAuthError auth_error(
         GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
@@ -167,11 +180,12 @@
         identity_manager(), identity_manager()->GetPrimaryAccountId(),
         auth_error);
 
-    [[delegate expect] syncController:sync_controller_
-                didStopSyncWithReason:CWVStopSyncReasonServer];
-    [sync_controller_
-        didSignoutWithSourceMetric:signin_metrics::ProfileSignout::
-                                       SERVER_FORCED_DISABLE];
+    [[delegate expect] syncControllerDidStopSync:sync_controller_];
+    identity_manager()->GetPrimaryAccountMutator()->ClearPrimaryAccount(
+        signin::PrimaryAccountMutator::ClearAccountsAction::kDefault,
+        signin_metrics::ProfileSignout::USER_CLICKED_SIGNOUT_SETTINGS,
+        signin_metrics::SignoutDelete::IGNORE_METRIC);
+
     [delegate verify];
   }
 }
@@ -181,18 +195,36 @@
   CWVIdentity* identity = [[CWVIdentity alloc] initWithEmail:@(kTestEmail)
                                                     fullName:@(kTestFullName)
                                                       gaiaID:@(kTestGaiaId)];
-  id unused_mock = OCMProtocolMock(@protocol(CWVSyncControllerDataSource));
-  [sync_controller_ startSyncWithIdentity:identity dataSource:unused_mock];
+  id data_source = OCMProtocolMock(@protocol(CWVSyncControllerDataSource));
+  [[[data_source stub] andReturn:@[ identity ]] allKnownIdentities];
+  CWVSyncController.dataSource = data_source;
+  [sync_controller_ startSyncWithIdentity:identity];
   CWVIdentity* currentIdentity = sync_controller_.currentIdentity;
   EXPECT_TRUE(currentIdentity);
   EXPECT_NSEQ(identity.email, currentIdentity.email);
   EXPECT_NSEQ(identity.fullName, currentIdentity.fullName);
   EXPECT_NSEQ(identity.gaiaID, currentIdentity.gaiaID);
 
+  EXPECT_CALL(*mock_sync_service(), StopAndClear());
   [sync_controller_ stopSyncAndClearIdentity];
   EXPECT_FALSE(sync_controller_.currentIdentity);
 }
 
+// Verifies CWVSyncController's consent API.
+TEST_F(CWVSyncControllerTest, Consent) {
+  EXPECT_CALL(*mock_sync_service()->GetMockUserSettings(),
+              IsFirstSetupComplete())
+      .WillOnce(Return(false));
+  EXPECT_TRUE(sync_controller_.consentNeeded);
+  EXPECT_CALL(*mock_sync_service()->GetMockUserSettings(),
+              SetFirstSetupComplete(_));
+  [sync_controller_ consent];
+  EXPECT_CALL(*mock_sync_service()->GetMockUserSettings(),
+              IsFirstSetupComplete())
+      .WillOnce(Return(true));
+  EXPECT_FALSE(sync_controller_.consentNeeded);
+}
+
 // Verifies CWVSyncController's passphrase API.
 TEST_F(CWVSyncControllerTest, Passphrase) {
   EXPECT_CALL(*mock_sync_service()->GetMockUserSettings(),
diff --git a/ios/web_view/internal/sync/web_view_sync_client.mm b/ios/web_view/internal/sync/web_view_sync_client.mm
index aa9af38d..f16d60a 100644
--- a/ios/web_view/internal/sync/web_view_sync_client.mm
+++ b/ios/web_view/internal/sync/web_view_sync_client.mm
@@ -46,12 +46,11 @@
 
 namespace {
 syncer::ModelTypeSet GetDisabledTypes() {
-  // Only want credit card autofill for now.
-  // TODO(crbug.com/906910): Remove syncer::AUTOFILL_PROFILE and
-  // syncer::PASSWORDS as well once they are ready.
   syncer::ModelTypeSet disabled_types = syncer::UserTypes();
   disabled_types.Remove(syncer::AUTOFILL_WALLET_DATA);
   disabled_types.Remove(syncer::AUTOFILL_WALLET_METADATA);
+  disabled_types.Remove(syncer::AUTOFILL_PROFILE);
+  disabled_types.Remove(syncer::PASSWORDS);
   return disabled_types;
 }
 }  // namespace
diff --git a/ios/web_view/internal/web_view_browser_state.mm b/ios/web_view/internal/web_view_browser_state.mm
index 7993f54..666fb09 100644
--- a/ios/web_view/internal/web_view_browser_state.mm
+++ b/ios/web_view/internal/web_view_browser_state.mm
@@ -26,6 +26,7 @@
 #include "components/signin/ios/browser/active_state_manager.h"
 #include "components/sync/base/pref_names.h"
 #include "components/sync/base/sync_prefs.h"
+#include "components/sync_device_info/device_info_prefs.h"
 #include "components/sync_sessions/session_sync_prefs.h"
 #include "components/translate/core/browser/translate_pref_names.h"
 #include "components/translate/core/browser/translate_prefs.h"
@@ -179,6 +180,7 @@
   gcm::GCMChannelStatusSyncer::RegisterProfilePrefs(pref_registry);
   sync_sessions::SessionSyncPrefs::RegisterProfilePrefs(pref_registry);
   syncer::SyncPrefs::RegisterProfilePrefs(pref_registry);
+  syncer::DeviceInfoPrefs::RegisterProfilePrefs(pref_registry);
 #endif  // BUILDFLAG(IOS_WEB_VIEW_ENABLE_SYNC)
 
   // Instantiate all factories to setup dependency graph for pref registration.
diff --git a/ios/web_view/internal/web_view_web_main_parts.mm b/ios/web_view/internal/web_view_web_main_parts.mm
index a9a68b7..9860c03 100644
--- a/ios/web_view/internal/web_view_web_main_parts.mm
+++ b/ios/web_view/internal/web_view_web_main_parts.mm
@@ -50,10 +50,8 @@
 
 #if BUILDFLAG(IOS_WEB_VIEW_ENABLE_SYNC)
   std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
-  std::string enable_features = base::JoinString(
-      {autofill::features::kAutofillEnableAccountWalletStorage.name,
-       autofill::features::kAutofillUpstream.name},
-      ",");
+  std::string enable_features =
+      base::JoinString({autofill::features::kAutofillUpstream.name}, ",");
   std::string disabled_features = base::JoinString(
       {// Allows form_structure.cc to run heuristics on single field forms.
        // This is needed to find autofillable password forms with less than 3
diff --git a/ios/web_view/public/cwv_identity.h b/ios/web_view/public/cwv_identity.h
index 74c9895..d8bb494 100644
--- a/ios/web_view/public/cwv_identity.h
+++ b/ios/web_view/public/cwv_identity.h
@@ -15,14 +15,14 @@
 CWV_EXPORT
 @interface CWVIdentity : NSObject
 
-- (instancetype)initWithEmail:(NSString*)email
+- (instancetype)initWithEmail:(nullable NSString*)email
                      fullName:(nullable NSString*)fullName
                        gaiaID:(NSString*)gaiaID NS_DESIGNATED_INITIALIZER;
 
 - (instancetype)init NS_UNAVAILABLE;
 
 // The user's email address. e.g. john.doe@chromium.org.
-@property(nonatomic, copy, readonly) NSString* email;
+@property(nonatomic, copy, readonly, nullable) NSString* email;
 
 // The user's full name. e.g. John Doe.
 @property(nonatomic, copy, readonly, nullable) NSString* fullName;
diff --git a/ios/web_view/public/cwv_sync_controller.h b/ios/web_view/public/cwv_sync_controller.h
index aa28ad21..885f1ea 100644
--- a/ios/web_view/public/cwv_sync_controller.h
+++ b/ios/web_view/public/cwv_sync_controller.h
@@ -42,14 +42,16 @@
 };
 
 // Used to manage syncing for autofill and password data. Usage:
-// 1. Call |startSyncWithIdentity:dataSource:| to start syncing with identity.
-// 2. Call |stopSyncAndClearIdentity| to stop syncing.
-// It is necessary to call |startSyncWithIdentity:dataSource:| once per cold app
-// launch to keep |currentIdentity| syncing. Remember to set the |delegate| to
-// listen to sync start and stop events.
+// 1. Set the |dataSource| and |delegate|.
+// 2. Call |startSyncWithIdentity:| to start syncing with identity.
+// 3. Call |stopSyncAndClearIdentity| to stop syncing.
 CWV_EXPORT
 @interface CWVSyncController : NSObject
 
+// The data source of CWVSyncController.
+@property(class, nonatomic, weak, nullable) id<CWVSyncControllerDataSource>
+    dataSource;
+
 // The delegate of CWVSyncController.
 @property(nonatomic, weak, nullable) id<CWVSyncControllerDelegate> delegate;
 
@@ -61,24 +63,36 @@
 // is invoked in |delegate|.
 @property(nonatomic, readonly, getter=isPassphraseNeeded) BOOL passphraseNeeded;
 
+// Whether or not |currentIdentity| has opted into sync. Not meaningful
+// until |currentIdentity| is set and |syncControllerDidStartSync:| callback in
+// is invoked in |delegate|.
+@property(nonatomic, readonly, getter=isConsentNeeded) BOOL consentNeeded;
+
 - (instancetype)init NS_UNAVAILABLE;
 
-// Start syncing with |identity|. |dataSource| is used to obtain access tokens.
+// Start syncing with |identity|.
 // |identity| will be persisted as |currentIdentity| and continue syncing until
-// |stopSyncAndClearIdentity| is called or the app is restarted.
-- (void)startSyncWithIdentity:(CWVIdentity*)identity
-                   dataSource:
-                       (__weak id<CWVSyncControllerDataSource>)dataSource;
+// |stopSyncAndClearIdentity| is called.
+// Make sure |dataSource| is set so access tokens can be fetched.
+- (void)startSyncWithIdentity:(CWVIdentity*)identity;
 
 // Stops syncs and nils out |currentIdentity|. This method is idempotent.
 - (void)stopSyncAndClearIdentity;
 
 // If |passphraseNeeded| is |YES|. Call this to unlock the sync data.
-// Only call after calling |startSyncWithIdentity:dataSource:| and receiving
+// Only call after calling |startSyncWithIdentity:| and receiving
 // |syncControllerDidStartSync:| callback in |delegate|.
 // No op if |passphraseNeeded| is |NO|. Returns |YES| if successful.
 - (BOOL)unlockWithPassphrase:(NSString*)passphrase;
 
+// If |consentNeeded| is |YES|, call this method to opt the |currentIdentity|
+// into sync. Notes:
+// - Only call after calling |startSyncWithIdentity:| and receiving
+//   |syncControllerDidStartSync:| callback in |delegate|.
+// - Only call after receiving explicit consent from the user. For example,
+//   user accepts an opt-in UI prompt.
+- (void)consent;
+
 @end
 
 NS_ASSUME_NONNULL_END
diff --git a/ios/web_view/public/cwv_sync_controller_data_source.h b/ios/web_view/public/cwv_sync_controller_data_source.h
index 6da71a9..a8a3fe4 100644
--- a/ios/web_view/public/cwv_sync_controller_data_source.h
+++ b/ios/web_view/public/cwv_sync_controller_data_source.h
@@ -9,22 +9,27 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
-@class CWVSyncController;
+@class CWVIdentity;
 
 // Data source of CWVSyncController.
 @protocol CWVSyncControllerDataSource<NSObject>
 
 // Called when access tokens are requested.
+// |identity| The user whose access tokens are requested.
 // |scopes| OAuth scopes requested.
 // |completionHandler| Use to pass back token information.
-// If successful, only |accessToken| and |expirationDate| should be non-nil.
-// If unsuccessful, only |error| should be non-nil.
-- (void)syncController:(CWVSyncController*)syncController
-    getAccessTokenForScopes:(NSArray<NSString*>*)scopes
-          completionHandler:
-              (void (^)(NSString* _Nullable accessToken,
-                        NSDate* _Nullable expirationDate,
-                        NSError* _Nullable error))completionHandler;
+// If successful, only |accessToken| and |expirationDate| will be non-nil.
+// If unsuccessful, only |error| will be non-nil.
+- (void)fetchAccessTokenForIdentity:(CWVIdentity*)identity
+                             scopes:(NSArray<NSString*>*)scopes
+                  completionHandler:
+                      (void (^)(NSString* _Nullable accessToken,
+                                NSDate* _Nullable expirationDate,
+                                NSError* _Nullable error))completionHandler;
+
+// Return all available identities. This is used internally to track if accounts
+// become stale and need to be removed.
+- (NSArray<CWVIdentity*>*)allKnownIdentities;
 
 @end
 
diff --git a/ios/web_view/public/cwv_sync_controller_delegate.h b/ios/web_view/public/cwv_sync_controller_delegate.h
index 66ee24a..60f6f84 100644
--- a/ios/web_view/public/cwv_sync_controller_delegate.h
+++ b/ios/web_view/public/cwv_sync_controller_delegate.h
@@ -9,13 +9,6 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
-typedef NS_ENUM(NSInteger, CWVStopSyncReason) {
-  // When sync is stopped explicitly via |stopSyncAndClearIdentity|.
-  CWVStopSyncReasonClient = 0,
-  // When sync was reset from another device.
-  CWVStopSyncReasonServer = 1
-};
-
 @class CWVSyncController;
 
 // Delegate of CWVSyncController.
@@ -23,8 +16,9 @@
 
 @optional
 
-// Called when sync has been started. Check |syncController|'s |needsPassphrase|
-// property to see if |unlockWithPassphrase:| is necessary.
+// Called when sync has started. Check |syncController|'s |passphraseNeeded|
+// property to see if |unlockWithPassphrase:| is necessary, and also check
+// |consentNeeded| to see if |consent| is necessary.
 - (void)syncControllerDidStartSync:(CWVSyncController*)syncController;
 
 // Called when sync fails. |error|'s code is a CWVSyncError.
@@ -32,9 +26,8 @@
 - (void)syncController:(CWVSyncController*)syncController
       didFailWithError:(NSError*)error;
 
-// Called after sync was stopped. |reason| Indicates why sync was stopped.
-- (void)syncController:(CWVSyncController*)syncController
-    didStopSyncWithReason:(CWVStopSyncReason)reason;
+// Called after sync has stopped.
+- (void)syncControllerDidStopSync:(CWVSyncController*)syncController;
 
 @end
 
diff --git a/ios/web_view/shell/shell_auth_service_fake.m b/ios/web_view/shell/shell_auth_service_fake.m
index a3e5e14c..78a4bea 100644
--- a/ios/web_view/shell/shell_auth_service_fake.m
+++ b/ios/web_view/shell/shell_auth_service_fake.m
@@ -17,11 +17,12 @@
 
 #pragma mark CWVSyncControllerDataSource
 
-- (void)syncController:(CWVSyncController*)syncController
-    getAccessTokenForScopes:(NSArray<NSString*>*)scopes
-          completionHandler:(void (^)(NSString* accessToken,
-                                      NSDate* expirationDate,
-                                      NSError* error))completionHandler {
+- (void)fetchAccessTokenForIdentity:(CWVIdentity*)identity
+                             scopes:(NSArray<NSString*>*)scopes
+                  completionHandler:
+                      (void (^)(NSString* _Nullable accessToken,
+                                NSDate* _Nullable expirationDate,
+                                NSError* _Nullable error))completionHandler {
   // Always returns an error.
   if (completionHandler) {
     completionHandler(
@@ -32,4 +33,8 @@
   }
 }
 
+- (NSArray<CWVIdentity*>*)allKnownIdentities {
+  return [self identities];
+}
+
 @end
diff --git a/ios/web_view/shell/shell_view_controller.m b/ios/web_view/shell/shell_view_controller.m
index ce05bd1..63b7df6 100644
--- a/ios/web_view/shell/shell_view_controller.m
+++ b/ios/web_view/shell/shell_view_controller.m
@@ -350,9 +350,7 @@
                                 CWVSyncController* syncController =
                                     weakSelf.webView.configuration
                                         .syncController;
-                                [syncController
-                                    startSyncWithIdentity:identity
-                                               dataSource:_authService];
+                                [syncController startSyncWithIdentity:identity];
                               }]];
   }
 
@@ -745,9 +743,8 @@
   NSLog(@"%@:%@", NSStringFromSelector(_cmd), error);
 }
 
-- (void)syncController:(CWVSyncController*)syncController
-    didStopSyncWithReason:(CWVStopSyncReason)reason {
-  NSLog(@"%@:%ld", NSStringFromSelector(_cmd), (long)reason);
+- (void)syncControllerDidStopSync:(CWVSyncController*)syncController {
+  NSLog(@"%@", NSStringFromSelector(_cmd));
 }
 
 @end
diff --git a/media/filters/fuchsia/fuchsia_video_decoder.cc b/media/filters/fuchsia/fuchsia_video_decoder.cc
index 4b3d5b32..e9e1bb3e 100644
--- a/media/filters/fuchsia/fuchsia_video_decoder.cc
+++ b/media/filters/fuchsia/fuchsia_video_decoder.cc
@@ -179,6 +179,8 @@
   int GetMaxDecodeRequests() const override;
 
  private:
+  bool InitializeDecryptor(CdmContext* cdm_context);
+
   // FuchsiaSecureStreamDecryptor::Client implementation.
   void OnDecryptorOutputPacket(StreamProcessorHelper::IoPacket packet) override;
   void OnDecryptorEndOfStreamPacket() override;
@@ -324,31 +326,14 @@
                                      InitCB init_cb,
                                      const OutputCB& output_cb,
                                      const WaitingCB& waiting_cb) {
+  DCHECK(decode_callbacks_.empty());
+
   auto done_callback = BindToCurrentLoop(std::move(init_cb));
 
-  if (!DropInputQueue(DecodeStatus::ABORTED))
-    return;
-
-  if (config.is_encrypted()) {
-    // Caller makes sure |cdm_context| is available if the stream is encrypted.
-    if (!cdm_context) {
-      LOG(ERROR) << "No cdm context for encrypted stream.";
-      std::move(done_callback).Run(false);
-      return;
-    }
-
-    // If Cdm is not FuchsiaCdm then fail initialization to allow decoder
-    // selector to choose DecryptingDemuxerStream, which will handle the
-    // decryption and pass the clear stream to this decoder.
-    FuchsiaCdmContext* fuchsia_cdm = cdm_context->GetFuchsiaCdmContext();
-    if (!fuchsia_cdm) {
-      DVLOG(1) << "FuchsiaVideoDecoder is compatible only with Fuchsia CDM.";
-      std::move(done_callback).Run(false);
-      return;
-    }
-
-    decryptor_ = fuchsia_cdm->CreateSecureDecryptor(this);
-  }
+  // There should be no pending decode request, so DropInputQueue() is not
+  // expected to fail.
+  bool result = DropInputQueue(DecodeStatus::ABORTED);
+  DCHECK(result);
 
   output_cb_ = output_cb;
   container_pixel_aspect_ratio_ = config.GetPixelAspectRatio();
@@ -356,28 +341,39 @@
   // If we already have |decoder_| that was initializes for the same codec then
   // keep using it.
   if (decoder_ && current_codec_ == config.codec()) {
-    // Input buffers can be in one of the following states here:
-    // 1. Input buffer constraints are empty, i.e. OnInputConstraints() event
-    //   hasn't been received yet. Input buffers will be allocated once
-    //   OnInputConstraints() is received.
-    // 2. Input buffers are being created.
-    // 3. Input buffers exist.
-    // 4. Input buffers were destroyed by DropInputQueue() call above (which is
-    //   required for encrypted streams).
-    //
-    // In the last case we need to re-initialize input buffers by calling
-    // OnInputConstraints().
-    if (decoder_input_constraints_.has_value() &&
-        !input_buffer_collection_creator_ && !input_buffer_collection_) {
-      OnInputConstraints(std::move(decoder_input_constraints_).value());
+    bool have_decryptor = decryptor_ != nullptr;
+    if (have_decryptor != config.is_encrypted()) {
+      // If decryption mode has changed then we need to re-initialize input
+      // buffers.
+      ReleaseInputBuffers();
+      decryptor_.reset();
+
+      // Initialize decryptor for encrypted streams.
+      if (config.is_encrypted() && !InitializeDecryptor(cdm_context)) {
+        std::move(done_callback).Run(false);
+        return;
+      }
+
+      // If we haven't received input constraints yet then input buffers will be
+      // initialized later when OnInputConstraints() is received.
+      if (decoder_input_constraints_.has_value()) {
+        OnInputConstraints(std::move(decoder_input_constraints_).value());
+      }
     }
 
     std::move(done_callback).Run(true);
     return;
   }
 
+  decryptor_.reset();
   decoder_.Unbind();
 
+  // Initialize decryptor for encrypted streams.
+  if (config.is_encrypted() && !InitializeDecryptor(cdm_context)) {
+    std::move(done_callback).Run(false);
+    return;
+  }
+
   // Reset IO buffers since we won't be able to re-use them.
   ReleaseInputBuffers();
   ReleaseOutputBuffers();
@@ -483,6 +479,29 @@
   return num_input_buffers_ + 1;
 }
 
+bool FuchsiaVideoDecoder::InitializeDecryptor(CdmContext* cdm_context) {
+  DCHECK(!decryptor_);
+
+  // Caller makes sure |cdm_context| is available if the stream is encrypted.
+  if (!cdm_context) {
+    DLOG(ERROR) << "No cdm context for encrypted stream.";
+    return false;
+  }
+
+  // If Cdm is not FuchsiaCdm then fail initialization to allow decoder
+  // selector to choose DecryptingDemuxerStream, which will handle the
+  // decryption and pass the clear stream to this decoder.
+  FuchsiaCdmContext* fuchsia_cdm = cdm_context->GetFuchsiaCdmContext();
+  if (!fuchsia_cdm) {
+    DLOG(ERROR) << "FuchsiaVideoDecoder is compatible only with Fuchsia CDM.";
+    return false;
+  }
+
+  decryptor_ = fuchsia_cdm->CreateSecureDecryptor(this);
+
+  return true;
+}
+
 void FuchsiaVideoDecoder::OnDecryptorOutputPacket(
     StreamProcessorHelper::IoPacket packet) {
   SendInputPacket(nullptr, std::move(packet));
@@ -917,11 +936,8 @@
     active_stream_ = false;
   }
 
-  // Input buffers have to be re-initialized for encrypted streams.
-  if (decryptor_) {
-    decryptor_.reset();
-    ReleaseInputBuffers();
-  }
+  if (decryptor_)
+    decryptor_->Reset();
 
   in_flight_input_packets_.clear();
 
diff --git a/media/fuchsia/cdm/fuchsia_stream_decryptor.cc b/media/fuchsia/cdm/fuchsia_stream_decryptor.cc
index 79e8ed8..5687b74e 100644
--- a/media/fuchsia/cdm/fuchsia_stream_decryptor.cc
+++ b/media/fuchsia/cdm/fuchsia_stream_decryptor.cc
@@ -403,6 +403,10 @@
   DecryptInternal(std::move(encrypted));
 }
 
+void FuchsiaSecureStreamDecryptor::Reset() {
+  ResetStream();
+}
+
 void FuchsiaSecureStreamDecryptor::AllocateOutputBuffers(
     const fuchsia::media::StreamBufferConstraints& stream_constraints) {
   if (complete_buffer_allocation_callback_) {
diff --git a/media/fuchsia/cdm/fuchsia_stream_decryptor.h b/media/fuchsia/cdm/fuchsia_stream_decryptor.h
index 0d07690..1861260 100644
--- a/media/fuchsia/cdm/fuchsia_stream_decryptor.h
+++ b/media/fuchsia/cdm/fuchsia_stream_decryptor.h
@@ -126,6 +126,9 @@
 
   void Decrypt(scoped_refptr<DecoderBuffer> encrypted);
 
+  // Drops all pending decryption requests.
+  void Reset();
+
  private:
   // StreamProcessorHelper::Client overrides.
   void AllocateOutputBuffers(const fuchsia::media::StreamBufferConstraints&
diff --git a/media/fuchsia/common/stream_processor_helper.cc b/media/fuchsia/common/stream_processor_helper.cc
index ba9f7bcc..9c0de9f 100644
--- a/media/fuchsia/common/stream_processor_helper.cc
+++ b/media/fuchsia/common/stream_processor_helper.cc
@@ -125,9 +125,12 @@
     return;
   }
 
-  processor_->CloseCurrentStream(stream_lifetime_ordinal_,
-                                 /*release_input_buffers=*/false,
-                                 /*release_output_buffers=*/false);
+  if (processor_ && active_stream_) {
+    processor_->CloseCurrentStream(stream_lifetime_ordinal_,
+                                   /*release_input_buffers=*/false,
+                                   /*release_output_buffers=*/false);
+  }
+
   stream_lifetime_ordinal_ += 2;
   active_stream_ = false;
   input_packets_.clear();
diff --git a/media/fuchsia/common/sysmem_buffer_pool.cc b/media/fuchsia/common/sysmem_buffer_pool.cc
index e8705fc..94b674a 100644
--- a/media/fuchsia/common/sysmem_buffer_pool.cc
+++ b/media/fuchsia/common/sysmem_buffer_pool.cc
@@ -63,7 +63,10 @@
   });
 }
 
-SysmemBufferPool::~SysmemBufferPool() = default;
+SysmemBufferPool::~SysmemBufferPool() {
+  if (collection_)
+    collection_->Close();
+}
 
 fuchsia::sysmem::BufferCollectionTokenPtr SysmemBufferPool::TakeToken() {
   DCHECK(!shared_tokens_.empty());
diff --git a/media/mojo/services/mojo_cdm_proxy_service.cc b/media/mojo/services/mojo_cdm_proxy_service.cc
index a8f2aa8..ac7866e 100644
--- a/media/mojo/services/mojo_cdm_proxy_service.cc
+++ b/media/mojo/services/mojo_cdm_proxy_service.cc
@@ -30,6 +30,10 @@
     mojom::CdmProxyClientAssociatedPtrInfo client,
     InitializeCallback callback) {
   DVLOG(2) << __func__;
+
+  CHECK(!has_initialize_been_called_) << "Initialize should only happen once";
+  has_initialize_been_called_ = true;
+
   client_.Bind(std::move(client));
 
   cdm_proxy_->Initialize(
@@ -85,6 +89,9 @@
                                         ::media::CdmProxy::Status status,
                                         ::media::CdmProxy::Protocol protocol,
                                         uint32_t crypto_session_id) {
+  CHECK_EQ(cdm_id_, CdmContext::kInvalidCdmId)
+      << "CDM proxy should only be created once.";
+
   if (status == ::media::CdmProxy::Status::kOk)
     cdm_id_ = context_->RegisterCdmProxy(this);
 
diff --git a/media/mojo/services/mojo_cdm_proxy_service.h b/media/mojo/services/mojo_cdm_proxy_service.h
index 5e79734..1ee107c 100644
--- a/media/mojo/services/mojo_cdm_proxy_service.h
+++ b/media/mojo/services/mojo_cdm_proxy_service.h
@@ -64,6 +64,8 @@
                      ::media::CdmProxy::Protocol protocol,
                      uint32_t crypto_session_id);
 
+  bool has_initialize_been_called_ = false;
+
   std::unique_ptr<::media::CdmProxy> cdm_proxy_;
   MojoCdmServiceContext* const context_ = nullptr;
 
diff --git a/media/mojo/services/mojo_cdm_proxy_unittest.cc b/media/mojo/services/mojo_cdm_proxy_unittest.cc
index 4942113..3e564a4 100644
--- a/media/mojo/services/mojo_cdm_proxy_unittest.cc
+++ b/media/mojo/services/mojo_cdm_proxy_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/run_loop.h"
 #include "base/test/gmock_callback_support.h"
+#include "base/test/gtest_util.h"
 #include "base/test/test_message_loop.h"
 #include "media/base/mock_filters.h"
 #include "media/cdm/cdm_proxy_context.h"
@@ -295,6 +296,11 @@
   Initialize(Status::kFail);
 }
 
+TEST_F(MojoCdmProxyTest, Initialize_Twice) {
+  Initialize();
+  EXPECT_CHECK_DEATH(Initialize());
+}
+
 TEST_F(MojoCdmProxyTest, Process) {
   Initialize();
   Process();
diff --git a/mojo/public/cpp/bindings/lib/connector.cc b/mojo/public/cpp/bindings/lib/connector.cc
index d8bea67..034a7bf 100644
--- a/mojo/public/cpp/bindings/lib/connector.cc
+++ b/mojo/public/cpp/bindings/lib/connector.cc
@@ -7,6 +7,8 @@
 #include <stdint.h>
 
 #include "base/bind.h"
+#include "base/compiler_specific.h"
+#include "base/debug/dump_without_crashing.h"
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/macros.h"
@@ -63,6 +65,11 @@
     100  // Use a 100 message quote by default.
 };
 
+const base::FeatureParam<int> kMojoRecordUnreadMessageCountCrashThreshold = {
+    &features::kMojoRecordUnreadMessageCount, "CrashThreshold",
+    0  // Set to zero to disable crash dumps by default.
+};
+
 int UnreadMessageCountQuota() {
   static const bool enabled =
       base::FeatureList::IsEnabled(features::kMojoRecordUnreadMessageCount);
@@ -77,6 +84,28 @@
   return quota;
 }
 
+// Disable inlining for this function to make sure it appears in the stack
+// trace on crash.
+NOINLINE void MaybeDumpWithoutCrashing(int quota_used) {
+  static const int crash_threshold =
+      kMojoRecordUnreadMessageCountCrashThreshold.Get();
+  if (crash_threshold == 0 || quota_used < crash_threshold)
+    return;
+
+  static bool have_crashed = false;
+  if (have_crashed)
+    return;
+
+  // Only crash once per process/per run. Note that this is slightly racy
+  // against concurrent quota overruns on multiple threads, but that's fine.
+  have_crashed = true;
+
+  // This is happening because the user of the interface implicated on the crash
+  // stack has queued up an unreasonable number of messages, namely
+  // |quota_used|.
+  base::debug::DumpWithoutCrashing();
+}
+
 }  // namespace
 
 // Used to efficiently maintain a doubly-linked list of all Connectors
@@ -368,8 +397,10 @@
     MojoResult rv = MojoQueryQuota(message_pipe_.get().value(),
                                    MOJO_QUOTA_TYPE_UNREAD_MESSAGE_COUNT,
                                    nullptr, &limit, &usage);
-    if (rv == MOJO_RESULT_OK && usage > max_unread_message_quota_used_)
+    if (rv == MOJO_RESULT_OK && usage > max_unread_message_quota_used_) {
+      MaybeDumpWithoutCrashing(usage);
       max_unread_message_quota_used_ = usage;
+    }
   }
 
   MojoResult rv =
diff --git a/net/base/network_change_notifier_fuchsia_unittest.cc b/net/base/network_change_notifier_fuchsia_unittest.cc
index 5e552d5..7c07a32 100644
--- a/net/base/network_change_notifier_fuchsia_unittest.cc
+++ b/net/base/network_change_notifier_fuchsia_unittest.cc
@@ -108,41 +108,33 @@
   ~FakeNetstack() override = default;
 
   // Adds |interface| to the interface query response list.
-  void PushInterface(fuchsia::netstack::NetInterface&& interface) {
+  void PushInterface(fuchsia::netstack::NetInterface interface) {
     interfaces_.push_back(std::move(interface));
   }
 
-  void PushRouteTableEntry(fuchsia::netstack::RouteTableEntry&& interface) {
-    route_table_.push_back(std::move(interface));
-  }
-
   // Sends the accumulated |interfaces_| to the OnInterfacesChanged event.
   void NotifyInterfaces() {
-    did_work_ = true;
     binding_.events().OnInterfacesChanged(std::move(interfaces_));
     interfaces_.clear();
   }
 
-  // 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();
+  void SetOnGetRouteTableCallback(base::OnceClosure callback) {
+    on_get_route_table_ = std::move(callback);
   }
 
  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);
     callback(std::move(table));
+
+    if (on_get_route_table_)
+      std::move(on_get_route_table_).Run();
   }
 
   void NotImplemented_(const std::string& name) override {
@@ -150,12 +142,10 @@
   }
 
   std::vector<fuchsia::netstack::NetInterface> interfaces_;
-  std::vector<fuchsia::netstack::RouteTableEntry> route_table_;
 
   fidl::Binding<fuchsia::netstack::Netstack> binding_;
 
-  // |true| if any FIDL API was called since the last DidDoWork().
-  bool did_work_ = false;
+  base::OnceClosure on_get_route_table_;
 
   DISALLOW_COPY_AND_ASSIGN(FakeNetstack);
 };
@@ -173,32 +163,23 @@
   ~FakeNetstackAsync() = default;
 
   // Asynchronously update the state of the netstack.
-  void PushInterface(fuchsia::netstack::NetInterface&& interface) {
+  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() {
+  void SetOnGetRouteTableCallback(base::OnceClosure callback) {
+    netstack_.Post(FROM_HERE, &FakeNetstack::SetOnGetRouteTableCallback,
+                   std::move(callback));
+  }
+
+  // Ensure that any PushInterface() or NotifyInterfaces() have been processed.
+  void FlushNetstackThread() {
     // 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:
@@ -234,7 +215,7 @@
   void CreateNotifier(uint32_t required_features = 0) {
     // Ensure that the Netstack internal state is up-to-date before the
     // notifier queries it.
-    netstack_.Synchronize();
+    netstack_.FlushNetstackThread();
 
     // Use a noop DNS notifier.
     dns_config_notifier_ = std::make_unique<SystemDnsConfigChangeNotifier>(
@@ -249,7 +230,8 @@
 
   void TearDown() override {
     // Spin the loops to catch any unintended notifications.
-    netstack_.Synchronize();
+    netstack_.FlushNetstackThread();
+    base::RunLoop().RunUntilIdle();
 
     if (notifier_) {
       NetworkChangeNotifier::RemoveConnectionTypeObserver(&observer_);
@@ -257,6 +239,15 @@
     }
   }
 
+  // Causes FakeNetstack to emit NotifyInterfaces(), and then runs the loop
+  // until the GetRouteTable() is called.
+  void NetstackNotifyInterfacesAndWaitForGetRouteTable() {
+    base::RunLoop loop;
+    netstack_.SetOnGetRouteTableCallback(loop.QuitClosure());
+    netstack_.NotifyInterfaces();
+    loop.Run();
+  }
+
  protected:
   base::test::SingleThreadTaskEnvironment task_environment_{
       base::test::SingleThreadTaskEnvironment::MainThreadType::IO};
@@ -287,7 +278,6 @@
       CreateNetInterface(kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
                          CreateIPv4Address(169, 254, 0, 1),
                          CreateIPv4Address(255, 255, 255, 0), {}));
-  netstack_.PushRouteTableEntry(CreateRouteTableEntry(kDefaultNic, true));
 
   CreateNotifier();
   EXPECT_EQ(NetworkChangeNotifier::ConnectionType::CONNECTION_UNKNOWN,
@@ -297,7 +287,6 @@
       CreateNetInterface(kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
                          CreateIPv4Address(169, 254, 0, 1),
                          CreateIPv4Address(255, 255, 255, 0), {}));
-  netstack_.PushRouteTableEntry(CreateRouteTableEntry(kDefaultNic, true));
   netstack_.NotifyInterfaces();
 }
 
@@ -370,7 +359,8 @@
   netstack_.PushInterface(CreateNetInterface(
       kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
       CreateIPv4Address(10, 0, 0, 1), CreateIPv4Address(255, 255, 0, 0), {}));
-  netstack_.NotifyInterfaces();
+
+  NetstackNotifyInterfacesAndWaitForGetRouteTable();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, IpChangeV6) {
@@ -388,7 +378,8 @@
       CreateNetInterface(kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
                          CreateIPv6Address({0xfe, 0x80, 0x02}),
                          CreateIPv6Address({0xfe, 0x80}), {}));
-  netstack_.NotifyInterfaces();
+
+  NetstackNotifyInterfacesAndWaitForGetRouteTable();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, MultiV6IPChanged) {
@@ -410,7 +401,8 @@
       kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
       CreateIPv4Address(10, 0, 0, 1), CreateIPv4Address(255, 255, 0, 0),
       std::move(addresses)));
-  netstack_.NotifyInterfaces();
+
+  NetstackNotifyInterfacesAndWaitForGetRouteTable();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, Ipv6AdditionalIpChange) {
@@ -431,7 +423,8 @@
       kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
       CreateIPv4Address(169, 254, 0, 1), CreateIPv4Address(255, 255, 255, 0),
       std::move(addresses)));
-  netstack_.NotifyInterfaces();
+
+  NetstackNotifyInterfacesAndWaitForGetRouteTable();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, InterfaceDown) {
@@ -451,7 +444,8 @@
   netstack_.PushInterface(
       CreateNetInterface(1, 0, 0, CreateIPv4Address(169, 254, 0, 1),
                          CreateIPv4Address(255, 255, 0, 0), {}));
-  netstack_.NotifyInterfaces();
+
+  NetstackNotifyInterfacesAndWaitForGetRouteTable();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, InterfaceUp) {
@@ -471,7 +465,8 @@
       CreateNetInterface(kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
                          CreateIPv4Address(169, 254, 0, 1),
                          CreateIPv4Address(255, 255, 0, 0), {}));
-  netstack_.NotifyInterfaces();
+
+  NetstackNotifyInterfacesAndWaitForGetRouteTable();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, InterfaceDeleted) {
@@ -488,7 +483,7 @@
             notifier_->GetCurrentConnectionType());
 
   // NotifyInterfaces() with no new PushInterfaces() means removing everything.
-  netstack_.NotifyInterfaces();
+  NetstackNotifyInterfacesAndWaitForGetRouteTable();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, InterfaceAdded) {
@@ -507,7 +502,8 @@
                          fuchsia::hardware::ethernet::INFO_FEATURE_WLAN,
                          CreateIPv4Address(169, 254, 0, 1),
                          CreateIPv4Address(255, 255, 255, 0), {}));
-  netstack_.NotifyInterfaces();
+
+  NetstackNotifyInterfacesAndWaitForGetRouteTable();
 }
 
 TEST_F(NetworkChangeNotifierFuchsiaTest, SecondaryInterfaceAddedNoop) {
@@ -525,6 +521,7 @@
       CreateNetInterface(kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
                          CreateIPv4Address(169, 254, 0, 1),
                          CreateIPv4Address(255, 255, 255, 0), {}));
+
   netstack_.NotifyInterfaces();
 }
 
@@ -543,6 +540,7 @@
       CreateNetInterface(kDefaultNic, fuchsia::netstack::NetInterfaceFlagUp, 0,
                          CreateIPv4Address(169, 254, 0, 1),
                          CreateIPv4Address(255, 255, 255, 0), {}));
+
   netstack_.NotifyInterfaces();
 }
 
diff --git a/net/socket/tcp_client_socket_unittest.cc b/net/socket/tcp_client_socket_unittest.cc
index a1947d9..0c41330 100644
--- a/net/socket/tcp_client_socket_unittest.cc
+++ b/net/socket/tcp_client_socket_unittest.cc
@@ -604,7 +604,14 @@
               IsError(ERR_NETWORK_IO_SUSPENDED));
 }
 
-TEST_F(TCPClientSocketTest, SuspendDuringWrite) {
+// TODO(https://crbug.com/1005042): close(socket_fd_) hangs on Fuchsia in this
+// test.
+#if defined(OS_FUCHSIA)
+#define MAYBE_SuspendDuringWrite DISABLED_SuspendDuringWrite
+#else
+#define MAYBE_SuspendDuringWrite SuspendDuringWrite
+#endif
+TEST_F(TCPClientSocketTest, MAYBE_SuspendDuringWrite) {
   std::unique_ptr<StreamSocket> accepted_socket;
   std::unique_ptr<TCPClientSocket> client_socket;
   CreateConnectedSockets(&accepted_socket, &client_socket);
diff --git a/printing/cups_config_helper.py b/printing/cups_config_helper.py
index 48cb3337..37e4fa5 100755
--- a/printing/cups_config_helper.py
+++ b/printing/cups_config_helper.py
@@ -31,7 +31,7 @@
   and return those flags as a list."""
 
   cups = subprocess.Popen([cups_config, '--cflags', '--ldflags', '--libs'],
-                          stdout=subprocess.PIPE)
+                          stdout=subprocess.PIPE, universal_newlines=True)
   flags = cups.communicate()[0].strip()
 
   flags_subset = []
@@ -67,7 +67,7 @@
     sysroot = sys.argv[2]
     cups_config = os.path.join(sysroot, 'usr', 'bin', 'cups-config')
     if not os.path.exists(cups_config):
-      print 'cups-config not found: %s' % cups_config
+      print('cups-config not found: %s' % cups_config)
       return 1
   else:
     cups_config = 'cups-config'
@@ -91,13 +91,13 @@
 
   if gn_libs_output:
     # Strip "-l" from beginning of libs, quote, and surround in [ ].
-    print '['
+    print('[')
     for lib in flags:
       if lib[:2] == "-l":
-        print '"%s", ' % lib[2:]
-    print ']'
+        print('"%s", ' % lib[2:])
+    print(']')
   else:
-    print ' '.join(flags)
+    print(' '.join(flags))
 
   return 0
 
diff --git a/printing/metafile.cc b/printing/metafile.cc
index 7ecbea7c..89200b2d 100644
--- a/printing/metafile.cc
+++ b/printing/metafile.cc
@@ -37,8 +37,8 @@
   if (!GetDataAsVector(&buffer))
     return false;
 
-  int size = base::checked_cast<int>(buffer.size());
-  if (file->WriteAtCurrentPos(&buffer[0], size) != size) {
+  if (!file->WriteAtCurrentPosAndCheck(
+          base::as_bytes(base::make_span(buffer)))) {
     DLOG(ERROR) << "Failed to save file.";
     return false;
   }
diff --git a/printing/metafile_skia.cc b/printing/metafile_skia.cc
index b0c1ea7..e14acb4 100644
--- a/printing/metafile_skia.cc
+++ b/printing/metafile_skia.cc
@@ -299,14 +299,14 @@
   std::unique_ptr<SkStreamAsset> asset(data_->data_stream->duplicate());
 
   static constexpr size_t kMaximumBufferSize = 1024 * 1024;
-  std::vector<char> buffer(std::min(kMaximumBufferSize, asset->getLength()));
+  std::vector<uint8_t> buffer(std::min(kMaximumBufferSize, asset->getLength()));
   do {
     size_t read_size = asset->read(&buffer[0], buffer.size());
     if (read_size == 0)
       break;
     DCHECK_GE(buffer.size(), read_size);
-    if (!file->WriteAtCurrentPos(&buffer[0],
-                                 base::checked_cast<int>(read_size))) {
+    if (!file->WriteAtCurrentPosAndCheck(
+            base::make_span(&buffer[0], read_size))) {
       return false;
     }
   } while (!asset->isAtEnd());
diff --git a/services/network/public/cpp/resource_response.cc b/services/network/public/cpp/resource_response.cc
index f08143d52..e1e99fe7 100644
--- a/services/network/public/cpp/resource_response.cc
+++ b/services/network/public/cpp/resource_response.cc
@@ -70,7 +70,6 @@
   service_worker_ready_time = url_response_head->service_worker_ready_time;
   is_in_cache_storage = url_response_head->is_in_cache_storage;
   cache_storage_cache_name = url_response_head->cache_storage_cache_name;
-  effective_connection_type = url_response_head->effective_connection_type;
   cert_status = url_response_head->cert_status;
   ssl_info = url_response_head->ssl_info;
   cors_exposed_header_names = url_response_head->cors_exposed_header_names;
@@ -136,7 +135,6 @@
   new_response->head.service_worker_ready_time = head.service_worker_ready_time;
   new_response->head.is_in_cache_storage = head.is_in_cache_storage;
   new_response->head.cache_storage_cache_name = head.cache_storage_cache_name;
-  new_response->head.effective_connection_type = head.effective_connection_type;
   new_response->head.cert_status = head.cert_status;
   new_response->head.ssl_info = head.ssl_info;
   new_response->head.cors_exposed_header_names = head.cors_exposed_header_names;
@@ -189,10 +187,9 @@
       proxy_server, was_fetched_via_service_worker,
       was_fallback_required_by_service_worker, url_list_via_service_worker,
       response_type, service_worker_start_time, service_worker_ready_time,
-      is_in_cache_storage, cache_storage_cache_name, effective_connection_type,
-      cert_status, ssl_info, cors_exposed_header_names,
-      did_service_worker_navigation_preload, should_report_corb_blocking,
-      async_revalidation_requested, did_mime_sniff,
+      is_in_cache_storage, cache_storage_cache_name, cert_status, ssl_info,
+      cors_exposed_header_names, did_service_worker_navigation_preload,
+      should_report_corb_blocking, async_revalidation_requested, did_mime_sniff,
       is_signed_exchange_inner_response, was_in_prefetch_cache,
       intercepted_by_plugin, is_legacy_tls_version, auth_challenge_info,
       content_security_policy, request_start, response_start, origin_policy,
diff --git a/services/network/public/cpp/resource_response_info.cc b/services/network/public/cpp/resource_response_info.cc
index 5cd38b8f..297b9c8 100644
--- a/services/network/public/cpp/resource_response_info.cc
+++ b/services/network/public/cpp/resource_response_info.cc
@@ -23,7 +23,6 @@
       was_fetched_via_service_worker(false),
       was_fallback_required_by_service_worker(false),
       response_type(mojom::FetchResponseType::kDefault),
-      effective_connection_type(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN),
       cert_status(0),
       did_service_worker_navigation_preload(false),
       should_report_corb_blocking(false),
diff --git a/services/network/public/cpp/resource_response_info.h b/services/network/public/cpp/resource_response_info.h
index f84f108..03f9e5e 100644
--- a/services/network/public/cpp/resource_response_info.h
+++ b/services/network/public/cpp/resource_response_info.h
@@ -157,10 +157,6 @@
   // the ServiceWorker. Empty if the response isn't from the CacheStorage.
   std::string cache_storage_cache_name;
 
-  // Effective connection type when the resource was fetched. This is populated
-  // only for responses that correspond to main frame requests.
-  net::EffectiveConnectionType effective_connection_type;
-
   // Bitmask of status info of the SSL certificate. See cert_status_flags.h for
   // values.
   net::CertStatus cert_status;
diff --git a/services/network/public/mojom/url_response_head.mojom b/services/network/public/mojom/url_response_head.mojom
index fd7490c..66c66f0 100644
--- a/services/network/public/mojom/url_response_head.mojom
+++ b/services/network/public/mojom/url_response_head.mojom
@@ -140,10 +140,6 @@
   // the ServiceWorker. Empty if the response isn't from the CacheStorage.
   string cache_storage_cache_name;
 
-  // Effective connection type when the resource was fetched. This is populated
-  // only for responses that correspond to main frame requests.
-  EffectiveConnectionType effective_connection_type;
-
   // Bitmask of status info of the SSL certificate. See cert_status_flags.h for
   // values.
   uint32 cert_status = 0;
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc
index dbef4f1..bba7906 100644
--- a/services/network/url_loader.cc
+++ b/services/network/url_loader.cc
@@ -95,8 +95,6 @@
   response->head.was_in_prefetch_cache =
       !(request->load_flags() & net::LOAD_PREFETCH) &&
       response_info.unused_since_prefetch;
-  response->head.effective_connection_type =
-      net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
 
   if (is_load_timing_enabled)
     request->GetLoadTimingInfo(&response->head.load_timing);
diff --git a/services/tracing/public/cpp/perfetto/android_system_producer.cc b/services/tracing/public/cpp/perfetto/android_system_producer.cc
index ba7772e..6ec1e90 100644
--- a/services/tracing/public/cpp/perfetto/android_system_producer.cc
+++ b/services/tracing/public/cpp/perfetto/android_system_producer.cc
@@ -11,11 +11,15 @@
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "services/tracing/public/cpp/perfetto/shared_memory.h"
+#include "services/tracing/public/cpp/traced_process_impl.h"
 #include "third_party/perfetto/include/perfetto/ext/tracing/core/commit_data_request.h"
 #include "third_party/perfetto/include/perfetto/ext/tracing/core/shared_memory_arbiter.h"
 #include "third_party/perfetto/include/perfetto/ext/tracing/core/startup_trace_writer_registry.h"
 #include "third_party/perfetto/include/perfetto/ext/tracing/core/trace_writer.h"
 #include "third_party/perfetto/include/perfetto/ext/tracing/ipc/producer_ipc_client.h"
+#include "third_party/perfetto/include/perfetto/protozero/scattered_heap_buffer.h"
+#include "third_party/perfetto/include/perfetto/protozero/scattered_stream_writer.h"
+#include "third_party/perfetto/protos/perfetto/common/track_event_descriptor.pbzero.h"
 
 namespace tracing {
 namespace {
@@ -81,6 +85,24 @@
   new_registration.set_will_notify_on_start(true);
   new_registration.set_will_notify_on_stop(true);
   new_registration.set_handles_incremental_state_clear(true);
+
+  // Add categories to the DataSourceDescriptor.
+  protozero::ScatteredHeapBuffer buffer;
+  protozero::ScatteredStreamWriter stream(&buffer);
+  perfetto::protos::pbzero::TrackEventDescriptor proto;
+  proto.Reset(&stream);
+  buffer.set_writer(&stream);
+
+  std::set<std::string> category_set;
+  tracing::TracedProcessImpl::GetInstance()->GetCategories(&category_set);
+  for (const std::string& s : category_set) {
+    proto.add_available_categories(s.c_str());
+  }
+
+  auto raw_proto = buffer.StitchSlices();
+  std::string track_event_descriptor_raw(raw_proto.begin(), raw_proto.end());
+  new_registration.set_track_event_descriptor_raw(track_event_descriptor_raw);
+
   service_->RegisterDataSource(new_registration);
 }
 
diff --git a/services/tracing/public/cpp/perfetto/producer_client.cc b/services/tracing/public/cpp/perfetto/producer_client.cc
index fdb2858d..e848bda9 100644
--- a/services/tracing/public/cpp/perfetto/producer_client.cc
+++ b/services/tracing/public/cpp/perfetto/producer_client.cc
@@ -13,11 +13,15 @@
 #include "mojo/public/cpp/bindings/remote.h"
 #include "services/tracing/public/cpp/perfetto/shared_memory.h"
 #include "services/tracing/public/cpp/perfetto/trace_event_data_source.h"
+#include "services/tracing/public/cpp/traced_process_impl.h"
 #include "services/tracing/public/mojom/constants.mojom.h"
 #include "third_party/perfetto/include/perfetto/ext/tracing/core/commit_data_request.h"
 #include "third_party/perfetto/include/perfetto/ext/tracing/core/shared_memory_arbiter.h"
 #include "third_party/perfetto/include/perfetto/ext/tracing/core/startup_trace_writer_registry.h"
 #include "third_party/perfetto/include/perfetto/ext/tracing/core/trace_writer.h"
+#include "third_party/perfetto/include/perfetto/protozero/scattered_heap_buffer.h"
+#include "third_party/perfetto/include/perfetto/protozero/scattered_stream_writer.h"
+#include "third_party/perfetto/protos/perfetto/common/track_event_descriptor.pbzero.h"
 
 namespace tracing {
 
@@ -99,6 +103,24 @@
   new_registration.set_will_notify_on_start(true);
   new_registration.set_will_notify_on_stop(true);
   new_registration.set_handles_incremental_state_clear(true);
+
+  // Add categories to the DataSourceDescriptor.
+  protozero::ScatteredHeapBuffer buffer;
+  protozero::ScatteredStreamWriter stream(&buffer);
+  perfetto::protos::pbzero::TrackEventDescriptor proto;
+  proto.Reset(&stream);
+  buffer.set_writer(&stream);
+
+  std::set<std::string> category_set;
+  tracing::TracedProcessImpl::GetInstance()->GetCategories(&category_set);
+  for (const std::string& s : category_set) {
+    proto.add_available_categories(s.c_str());
+  }
+
+  auto raw_proto = buffer.StitchSlices();
+  std::string track_event_descriptor_raw(raw_proto.begin(), raw_proto.end());
+  new_registration.set_track_event_descriptor_raw(track_event_descriptor_raw);
+
   producer_host_->RegisterDataSource(std::move(new_registration));
 }
 
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json
index ecc985f4..a5701f1 100644
--- a/testing/buildbot/chrome.json
+++ b/testing/buildbot/chrome.json
@@ -1076,6 +1076,77 @@
       }
     ]
   },
+  "chromeos-eve-google-rel": {
+    "additional_compile_targets": [
+      "chromiumos_preflight"
+    ],
+    "gtest_tests": [
+      {
+        "args": [
+          "--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.base_unittests.filter"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "eve",
+              "os": "ChromeOS",
+              "pool": "luci.chrome.cros-dut"
+            }
+          ]
+        },
+        "test": "base_unittests",
+        "trigger_script": {
+          "script": "//testing/trigger_scripts/chromeos_device_trigger.py"
+        }
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "eve",
+              "os": "ChromeOS",
+              "pool": "luci.chrome.cros-dut"
+            }
+          ],
+          "idempotent": false
+        },
+        "test": "chrome_all_tast_tests",
+        "trigger_script": {
+          "script": "//testing/trigger_scripts/chromeos_device_trigger.py"
+        }
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_type": "eve",
+              "os": "ChromeOS",
+              "pool": "luci.chrome.cros-dut"
+            }
+          ]
+        },
+        "test": "cros_browser_sanity_test",
+        "trigger_script": {
+          "script": "//testing/trigger_scripts/chromeos_device_trigger.py"
+        }
+      }
+    ]
+  },
   "chromeos-kevin-google-rel": {
     "additional_compile_targets": [
       "chromiumos_preflight"
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index 2b28a77..fb0f64e 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -1,12 +1,10 @@
 {
   "AAAAA1 AUTOGENERATED FILE DO NOT EDIT": {},
   "AAAAA2 See generate_buildbot_json.py to make changes": {},
-  "Android WebView O NetworkService (dbg)": {
+  "Android WebView P FYI (rel)": {
     "gtest_tests": [
       {
         "args": [
-          "--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.network_webview_CTS_test.filter",
-          "--enable-features=NetworkService,NetworkServiceInProcess",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -25,7 +23,7 @@
             {
               "cipd_package": "chromium/android_webview/tools/cts_archive",
               "location": "android_webview/tools/cts_archive",
-              "revision": "version:1.7"
+              "revision": "4kDr36wBuZtvbfaEin4U4oeFD7oAuN0flkWDImKBts4C"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -35,10 +33,10 @@
           ],
           "dimension_sets": [
             {
-              "device_os": "OPR3.170623.008",
+              "device_os": "PQ3A.190801.002",
               "device_os_flavor": "google",
               "device_os_type": "userdebug",
-              "device_type": "marlin",
+              "device_type": "walleye",
               "os": "Android"
             }
           ],
@@ -4531,8 +4529,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -4547,19 +4544,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -4570,6 +4557,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -4587,8 +4584,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -4603,19 +4599,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -4626,6 +4612,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -4643,8 +4639,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -4659,19 +4654,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -4682,6 +4667,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -4699,8 +4694,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -4715,19 +4709,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -4738,6 +4722,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -4755,8 +4749,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -4771,19 +4764,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -4794,6 +4777,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -4811,8 +4804,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -4827,19 +4819,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -4850,6 +4832,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -4867,8 +4859,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -4883,19 +4874,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -4906,6 +4887,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -4923,8 +4914,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -4939,19 +4929,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -4962,6 +4942,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -4979,8 +4969,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -4996,19 +4985,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -5019,6 +4998,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -5037,8 +5026,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -5053,19 +5041,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -5076,6 +5054,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -5093,8 +5081,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -5109,19 +5096,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -5132,6 +5109,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -5149,8 +5136,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -5165,19 +5151,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -5188,6 +5164,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -5205,8 +5191,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -5221,19 +5206,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -5244,6 +5219,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -5262,8 +5247,7 @@
           "--gtest_filter=-*UsingRealWebcam*",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -5278,19 +5262,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -5301,6 +5275,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -5318,8 +5302,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -5334,19 +5317,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -5357,6 +5330,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -5374,8 +5357,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -5390,19 +5372,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -5413,6 +5385,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -5430,8 +5412,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -5446,19 +5427,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -5469,6 +5440,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -5486,8 +5467,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -5502,19 +5482,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -5525,6 +5495,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -5545,8 +5525,7 @@
           "--gtest_filter=-org.chromium.chrome.browser.FeaturesAnnotationsTest#testFeaturesSetExistingFlags",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -5562,19 +5541,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -5585,6 +5554,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -5603,8 +5582,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -5619,19 +5597,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -5642,6 +5610,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -5659,8 +5637,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -5675,19 +5652,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -5698,6 +5665,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -5716,8 +5693,7 @@
           "--disable-features=NetworkServiceInProcess",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -5733,19 +5709,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -5756,6 +5722,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -5773,8 +5749,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -5789,19 +5764,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -5812,6 +5777,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -5830,8 +5805,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -5846,19 +5820,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -5869,6 +5833,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -5888,8 +5862,7 @@
           "--disable-features=NetworkServiceInProcess",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -5905,19 +5878,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -5928,6 +5891,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -5948,8 +5921,7 @@
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -5965,19 +5937,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -5988,6 +5950,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -6005,8 +5977,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -6021,19 +5992,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -6044,6 +6005,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -6063,8 +6034,7 @@
           "--disable-features=NetworkServiceInProcess",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -6080,19 +6050,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -6103,6 +6063,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -6121,8 +6091,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -6137,19 +6106,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -6160,6 +6119,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -6178,8 +6147,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -6194,19 +6162,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -6217,6 +6175,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -6234,8 +6202,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -6250,19 +6217,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -6273,6 +6230,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -6290,8 +6257,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -6306,19 +6272,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -6329,6 +6285,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -6346,8 +6312,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -6362,19 +6327,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -6385,6 +6340,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -6402,8 +6367,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -6418,19 +6382,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -6441,6 +6395,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -6458,8 +6422,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -6474,19 +6437,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -6497,6 +6450,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -6514,8 +6477,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -6530,19 +6492,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -6553,6 +6505,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -6570,8 +6532,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -6586,19 +6547,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -6609,6 +6560,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -6626,8 +6587,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -6642,19 +6602,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -6665,6 +6615,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -6682,8 +6642,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -6698,19 +6657,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -6721,6 +6670,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -6738,8 +6697,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -6754,19 +6712,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -6777,6 +6725,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -6794,8 +6752,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -6810,19 +6767,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -6833,6 +6780,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -6850,8 +6807,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -6866,19 +6822,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -6889,6 +6835,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -6906,8 +6862,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -6922,19 +6877,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -6945,6 +6890,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -6962,8 +6917,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -6978,19 +6932,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -7001,6 +6945,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -7018,8 +6972,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -7034,19 +6987,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -7057,6 +7000,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -7074,8 +7027,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -7090,19 +7042,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -7113,6 +7055,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -7130,8 +7082,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -7146,19 +7097,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -7169,6 +7110,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -7186,8 +7137,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -7202,19 +7152,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -7225,6 +7165,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -7242,8 +7192,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -7258,19 +7207,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -7281,6 +7220,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -7298,8 +7247,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -7314,19 +7262,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -7337,6 +7275,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -7354,8 +7302,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -7370,19 +7317,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -7393,6 +7330,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -7410,8 +7357,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -7426,19 +7372,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -7449,6 +7385,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -7467,8 +7413,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -7483,19 +7428,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -7506,6 +7441,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -7523,8 +7468,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -7539,19 +7483,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -7562,6 +7496,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -7579,8 +7523,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -7595,19 +7538,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -7618,6 +7551,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -7635,8 +7578,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -7651,19 +7593,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -7674,6 +7606,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -7691,8 +7633,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -7707,19 +7648,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -7730,6 +7661,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -7747,8 +7688,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -7763,19 +7703,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -7786,6 +7716,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -7803,8 +7743,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -7819,19 +7758,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -7842,6 +7771,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -7859,8 +7798,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -7875,19 +7813,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -7898,6 +7826,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -7915,8 +7853,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -7931,19 +7868,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -7954,6 +7881,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -7971,8 +7908,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -7987,19 +7923,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -8010,6 +7936,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -8027,8 +7963,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -8043,19 +7978,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -8066,6 +7991,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -8084,8 +8019,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -8100,19 +8034,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -8123,6 +8047,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -8140,8 +8074,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -8156,19 +8089,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -8179,6 +8102,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -8196,8 +8129,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -8212,19 +8144,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -8235,6 +8157,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -8255,8 +8187,7 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.network_webview_instrumentation_test_apk.filter",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -8272,19 +8203,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -8295,6 +8216,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
@@ -8313,8 +8244,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-name=20190716T160000Z_android_28_google_apis_x86",
-          "--emulator-home=../../.android"
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
         ],
         "merge": {
           "args": [
@@ -8329,19 +8259,9 @@
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
-              "cipd_package": "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86",
-              "location": ".android",
-              "revision": "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/emulator",
-              "location": "third_party/android_sdk/public",
-              "revision": "xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC"
-            },
-            {
-              "cipd_package": "chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86",
-              "location": "third_party/android_sdk/public",
-              "revision": "LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C"
+              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
+              "location": "bin",
+              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
             }
           ],
           "dimension_sets": [
@@ -8352,6 +8272,16 @@
               "os": "Ubuntu-16.04"
             }
           ],
+          "named_caches": [
+            {
+              "name": "avd_generic_android28",
+              "path": ".android"
+            },
+            {
+              "name": "system_images_android_28_google_apis_x86",
+              "path": ".emulator_sdk"
+            }
+          ],
           "output_links": [
             {
               "link": [
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index 43fdece..7a80cb5c 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -122,7 +122,7 @@
             {
               "cipd_package": "chromium/android_webview/tools/cts_archive",
               "location": "android_webview/tools/cts_archive",
-              "revision": "version:1.7"
+              "revision": "4kDr36wBuZtvbfaEin4U4oeFD7oAuN0flkWDImKBts4C"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -176,7 +176,7 @@
             {
               "cipd_package": "chromium/android_webview/tools/cts_archive",
               "location": "android_webview/tools/cts_archive",
-              "revision": "version:1.7"
+              "revision": "4kDr36wBuZtvbfaEin4U4oeFD7oAuN0flkWDImKBts4C"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -418,7 +418,7 @@
             {
               "cipd_package": "chromium/android_webview/tools/cts_archive",
               "location": "android_webview/tools/cts_archive",
-              "revision": "version:1.7"
+              "revision": "4kDr36wBuZtvbfaEin4U4oeFD7oAuN0flkWDImKBts4C"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -471,7 +471,7 @@
             {
               "cipd_package": "chromium/android_webview/tools/cts_archive",
               "location": "android_webview/tools/cts_archive",
-              "revision": "version:1.7"
+              "revision": "4kDr36wBuZtvbfaEin4U4oeFD7oAuN0flkWDImKBts4C"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -755,7 +755,7 @@
             {
               "cipd_package": "chromium/android_webview/tools/cts_archive",
               "location": "android_webview/tools/cts_archive",
-              "revision": "version:1.7"
+              "revision": "4kDr36wBuZtvbfaEin4U4oeFD7oAuN0flkWDImKBts4C"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -808,7 +808,7 @@
             {
               "cipd_package": "chromium/android_webview/tools/cts_archive",
               "location": "android_webview/tools/cts_archive",
-              "revision": "version:1.7"
+              "revision": "4kDr36wBuZtvbfaEin4U4oeFD7oAuN0flkWDImKBts4C"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1186,7 +1186,7 @@
             {
               "cipd_package": "chromium/android_webview/tools/cts_archive",
               "location": "android_webview/tools/cts_archive",
-              "revision": "version:1.7"
+              "revision": "4kDr36wBuZtvbfaEin4U4oeFD7oAuN0flkWDImKBts4C"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1239,7 +1239,7 @@
             {
               "cipd_package": "chromium/android_webview/tools/cts_archive",
               "location": "android_webview/tools/cts_archive",
-              "revision": "version:1.7"
+              "revision": "4kDr36wBuZtvbfaEin4U4oeFD7oAuN0flkWDImKBts4C"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1619,7 +1619,7 @@
             {
               "cipd_package": "chromium/android_webview/tools/cts_archive",
               "location": "android_webview/tools/cts_archive",
-              "revision": "version:1.7"
+              "revision": "4kDr36wBuZtvbfaEin4U4oeFD7oAuN0flkWDImKBts4C"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -1672,7 +1672,7 @@
             {
               "cipd_package": "chromium/android_webview/tools/cts_archive",
               "location": "android_webview/tools/cts_archive",
-              "revision": "version:1.7"
+              "revision": "4kDr36wBuZtvbfaEin4U4oeFD7oAuN0flkWDImKBts4C"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -29514,7 +29514,7 @@
             {
               "cipd_package": "chromium/android_webview/tools/cts_archive",
               "location": "android_webview/tools/cts_archive",
-              "revision": "version:1.7"
+              "revision": "4kDr36wBuZtvbfaEin4U4oeFD7oAuN0flkWDImKBts4C"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index bd61695..43c5a84 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -60,14 +60,13 @@
     "gtest_tests": [
       {
         "args": [
-          "--enable-features=UseSkiaRenderer",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/skia_renderer.browser_tests.filter"
+          "--disable-features=UseSkiaRenderer"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "skia_renderer_browser_tests",
+        "name": "non_skia_renderer_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index e8b51cb..3c5e067 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -10146,76 +10146,6 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "intel-hd-630-ubuntu-stable",
-              "os": "linux-intel-stable",
-              "pool": "Chrome-GPU"
-            }
-          ],
-          "shards": 4
-        },
-        "test": "angle_end2end_tests"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0",
-          "--no-xvfb"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "intel-hd-630-ubuntu-stable",
-              "os": "linux-intel-stable",
-              "pool": "Chrome-GPU"
-            }
-          ]
-        },
-        "test": "angle_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-retry-limit=0"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "intel-hd-630-ubuntu-stable",
-              "os": "linux-intel-stable",
-              "pool": "Chrome-GPU"
-            }
-          ]
-        },
-        "test": "angle_white_box_tests"
-      },
-      {
-        "args": [
           "--enable-gpu",
           "--test-launcher-bot-mode",
           "--test-launcher-jobs=1",
@@ -10247,89 +10177,6 @@
           ]
         },
         "test": "content_browsertests"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--use-cmd-decoder=validating"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "intel-hd-630-ubuntu-stable",
-              "os": "linux-intel-stable",
-              "pool": "Chrome-GPU"
-            }
-          ]
-        },
-        "test": "gl_tests"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--no-xvfb"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "intel-hd-630-ubuntu-stable",
-              "os": "linux-intel-stable",
-              "pool": "Chrome-GPU"
-            }
-          ]
-        },
-        "test": "gl_unittests"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "intel-hd-630-ubuntu-stable",
-              "os": "linux-intel-stable",
-              "pool": "Chrome-GPU"
-            }
-          ]
-        },
-        "test": "gles2_conform_test"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "intel-hd-630-ubuntu-stable",
-              "os": "linux-intel-stable",
-              "pool": "Chrome-GPU"
-            }
-          ]
-        },
-        "test": "swiftshader_unittests"
       }
     ],
     "isolated_scripts": [
@@ -10693,76 +10540,6 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "nvidia-quadro-p400-ubuntu-stable",
-              "os": "linux-nvidia-stable",
-              "pool": "Chrome-GPU"
-            }
-          ],
-          "shards": 4
-        },
-        "test": "angle_end2end_tests"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0",
-          "--no-xvfb"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "nvidia-quadro-p400-ubuntu-stable",
-              "os": "linux-nvidia-stable",
-              "pool": "Chrome-GPU"
-            }
-          ]
-        },
-        "test": "angle_unittests"
-      },
-      {
-        "args": [
-          "--test-launcher-retry-limit=0"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "nvidia-quadro-p400-ubuntu-stable",
-              "os": "linux-nvidia-stable",
-              "pool": "Chrome-GPU"
-            }
-          ]
-        },
-        "test": "angle_white_box_tests"
-      },
-      {
-        "args": [
           "--enable-gpu",
           "--test-launcher-bot-mode",
           "--test-launcher-jobs=1",
@@ -10794,89 +10571,6 @@
           ]
         },
         "test": "content_browsertests"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--use-cmd-decoder=validating"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "nvidia-quadro-p400-ubuntu-stable",
-              "os": "linux-nvidia-stable",
-              "pool": "Chrome-GPU"
-            }
-          ]
-        },
-        "test": "gl_tests"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--no-xvfb"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "nvidia-quadro-p400-ubuntu-stable",
-              "os": "linux-nvidia-stable",
-              "pool": "Chrome-GPU"
-            }
-          ]
-        },
-        "test": "gl_unittests"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "nvidia-quadro-p400-ubuntu-stable",
-              "os": "linux-nvidia-stable",
-              "pool": "Chrome-GPU"
-            }
-          ]
-        },
-        "test": "gles2_conform_test"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "nvidia-quadro-p400-ubuntu-stable",
-              "os": "linux-nvidia-stable",
-              "pool": "Chrome-GPU"
-            }
-          ]
-        },
-        "test": "swiftshader_unittests"
       }
     ],
     "isolated_scripts": [
diff --git a/testing/buildbot/filters/BUILD.gn b/testing/buildbot/filters/BUILD.gn
index edd582b..b70cf3e 100644
--- a/testing/buildbot/filters/BUILD.gn
+++ b/testing/buildbot/filters/BUILD.gn
@@ -47,7 +47,6 @@
     "//testing/buildbot/filters/bfcache.browser_tests.filter",
     "//testing/buildbot/filters/code_coverage.browser_tests.filter",
     "//testing/buildbot/filters/pixel_browser_tests.filter",
-    "//testing/buildbot/filters/skia_renderer.browser_tests.filter",
     "//testing/buildbot/filters/webrtc_functional.browser_tests.filter",
     "//testing/buildbot/filters/webui_html_imports_polyfill_browser_tests.filter",
   ]
diff --git a/testing/buildbot/filters/android.webview_instrumentation_tests_oreo.filter b/testing/buildbot/filters/android.webview_instrumentation_tests_oreo.filter
index f97cf295..c279cf1 100644
--- a/testing/buildbot/filters/android.webview_instrumentation_tests_oreo.filter
+++ b/testing/buildbot/filters/android.webview_instrumentation_tests_oreo.filter
@@ -1,3 +1 @@
 -org.chromium.android_webview.test.AwAutofillTest.testJavascriptNotTriggerSelectControlChangeNotification
--org.chromium.android_webview.test.AwAutofillTest.testSelectControlChangeStartAutofillSession
--org.chromium.android_webview.test.AwAutofillTest.testSelectControlChangeNotification
diff --git a/testing/buildbot/filters/skia_renderer.browser_tests.filter b/testing/buildbot/filters/skia_renderer.browser_tests.filter
deleted file mode 100644
index 0930bc9..0000000
--- a/testing/buildbot/filters/skia_renderer.browser_tests.filter
+++ /dev/null
@@ -1,10 +0,0 @@
-# Some browser_tests are flaking and as the SkiaRenderer changes some timings
-# the rate of flakes could be affected. Currently most cases of this are fixed.
-# See https://crbug.com/982933 for details.
-# Add vasilyt@chromium.org and jonross@chromium.org on bugs related to flakes.
-
-# New flake exposed by SkiaRenderer. https://crbug.com/1004299
--DataSaverSiteBreakdownMetricsObserverBrowserTest.LazyLoadFrameDisabledInReload
-
-# Flaking generally. https://crbug.com/1000813
--SaveCardBubbleViewsFullFormBrowserTestForStatusChip.ClickingOnCreditCardIconInStatusChipReshowsBubble
diff --git a/testing/buildbot/generate_buildbot_json.py b/testing/buildbot/generate_buildbot_json.py
index 6b6efe5..64370c6 100755
--- a/testing/buildbot/generate_buildbot_json.py
+++ b/testing/buildbot/generate_buildbot_json.py
@@ -1009,7 +1009,7 @@
         bot_names.add(l[l.rindex('/') + 1:l.rindex('"')])
     return bot_names
 
-  def get_bots_that_do_not_actually_exist(self):
+  def get_builders_that_do_not_actually_exist(self):
     # Some of the bots on the chromium.gpu.fyi waterfall in particular
     # are defined only to be mirrored into trybots, and don't actually
     # exist on any of the waterfalls or consoles.
@@ -1049,15 +1049,15 @@
       'win32-dbg',
       'win-archive-dbg',
       'win32-archive-dbg',
-      # Defined in internal configs.
-      'chromeos-amd64-generic-google-rel',
-      'chromeos-betty-google-rel',
-      'chromeos-betty-pi-arc-google-rel',
-      'chromeos-kevin-google-rel',
       # code coverage, see https://crbug.com/1000367.
       'linux-chromeos-coverage-rel-dummy',
     ]
 
+  def get_internal_waterfalls(self):
+    # Similar to get_builders_that_do_not_actually_exist above, but for
+    # waterfalls defined in internal configs.
+    return ['chrome']
+
   def check_input_file_consistency(self, verbose=False):
     self.check_input_files_sorting(verbose)
 
@@ -1067,10 +1067,14 @@
 
     # All bots should exist.
     bot_names = self.get_valid_bot_names()
-    bots_that_dont_exist = self.get_bots_that_do_not_actually_exist()
+    internal_waterfalls = self.get_internal_waterfalls()
+    builders_that_dont_exist = self.get_builders_that_do_not_actually_exist()
     for waterfall in self.waterfalls:
+      # TODO(crbug.com/991417): Remove the need for this exception.
+      if waterfall['name'] in internal_waterfalls:
+        continue  # pragma: no cover
       for bot_name in waterfall['machines']:
-        if bot_name in bots_that_dont_exist:
+        if bot_name in builders_that_dont_exist:
           continue  # pragma: no cover
         if bot_name not in bot_names:
           if waterfall['name'] in ['client.v8.chromium', 'client.v8.fyi']:
@@ -1131,7 +1135,7 @@
         if removal not in all_bots:
           missing_bots.add(removal)
 
-    missing_bots = missing_bots - set(bots_that_dont_exist)
+    missing_bots = missing_bots - set(builders_that_dont_exist)
     if missing_bots:
       raise BBGenErr('The following nonexistent machines were referenced in '
                      'the test suite exceptions: ' + str(missing_bots))
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl
index 0ca4cd6..66ef679 100644
--- a/testing/buildbot/mixins.pyl
+++ b/testing/buildbot/mixins.pyl
@@ -548,32 +548,24 @@
   'pie-x86-emulator': {
     '$mixin_append': {
       'args': [
-        '--avd-name=20190716T160000Z_android_28_google_apis_x86',
-        '--emulator-home=../../.android',
+        '--avd-config=../../tools/android/avd/proto/generic_android28.textpb',
       ],
     },
     'swarming': {
-      'cipd_packages': [
-        {
-          'cipd_package': 'chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86',
-          'location': '.android',
-          'revision': 'J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC',
-        },
-        {
-          'cipd_package': 'chromium/third_party/android_sdk/public/emulator',
-          'location': 'third_party/android_sdk/public',
-          'revision': 'xhyuoquVvBTcJelgRjMKZeoBVSQRjB7pLVJPt5C9saIC',
-        },
-        {
-          'cipd_package': 'chromium/third_party/android_sdk/public/system-images/android-28/google_apis/x86',
-          'location': 'third_party/android_sdk/public',
-          'revision': 'LDa0XkTjgGYx7Amzg5qjIRgCfc4F_pq7rKMJVdACYx8C',
-        },
-      ],
       'dimensions': {
         'device_os': None,
         'device_type': None,
       },
+      'named_caches': [
+        {
+          'name': 'avd_generic_android28',
+          'path': '.android',
+        },
+        {
+          'name': 'system_images_android_28_google_apis_x86',
+          'path': '.emulator_sdk',
+        },
+      ]
     },
   },
   'pie_fleet': {
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 4185fa0b..858818d 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -457,7 +457,7 @@
       },
     },
 
-    'chromeos_device_kevin_tests': {
+    'chromeos_device_tests': {
       'base_unittests': {
         'args': [
           '--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.base_unittests.filter',
@@ -4685,10 +4685,9 @@
     },
 
     'skia_renderer_fyi_gtests': {
-      'skia_renderer_browser_tests': {
-        'args': [
-          '--enable-features=UseSkiaRenderer',
-          '--test-launcher-filter-file=../../testing/buildbot/filters/skia_renderer.browser_tests.filter',
+      'non_skia_renderer_browser_tests': {
+      'args': [
+          '--disable-features=UseSkiaRenderer',
         ],
         'swarming': {
           'shards': 10,
@@ -4970,7 +4969,7 @@
             {
               "cipd_package": 'chromium/android_webview/tools/cts_archive',
               'location': 'android_webview/tools/cts_archive',
-              'revision': 'version:1.7',
+              'revision': '4kDr36wBuZtvbfaEin4U4oeFD7oAuN0flkWDImKBts4C',
             }
           ]
         },
@@ -4988,7 +4987,7 @@
             {
               "cipd_package": 'chromium/android_webview/tools/cts_archive',
               'location': 'android_webview/tools/cts_archive',
-              'revision': 'version:1.7',
+              'revision': '4kDr36wBuZtvbfaEin4U4oeFD7oAuN0flkWDImKBts4C',
             }
           ]
         },
@@ -5574,17 +5573,6 @@
       'gpu_swiftshader_gtests',
     ],
 
-    'gpu_fyi_linux_skia_renderer_gtests': [
-      'gpu_angle_end2end_gtests',
-      'gpu_angle_unit_gtests',
-      'gpu_angle_white_box_gtests',
-      'gpu_common_gtests',
-      'gpu_desktop_specific_gtests',
-      'gpu_fyi_vulkan_gtests',
-      'gpu_gles2_conform_gtests',
-      'gpu_swiftshader_gtests',
-    ],
-
     'gpu_fyi_mac_debug_gtests': [
       'gpu_angle_end2end_gtests',
       'gpu_angle_unit_gtests',
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 3b1351e0..172e5bdca 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -53,12 +53,30 @@
           ],
         },
       },
+      'chromeos-eve-google-rel': {
+        'additional_compile_targets': [
+          'chromiumos_preflight',
+        ],
+        'test_suites': {
+          'gtest_tests': 'chromeos_device_tests',
+        },
+        'swarming': {
+          'dimension_sets': [
+            {
+              'os': 'ChromeOS',
+              'device_type': 'eve',
+              'pool': 'luci.chrome.cros-dut',
+            },
+          ],
+        },
+        'os_type': 'chromeos'
+      },
       'chromeos-kevin-google-rel': {
         'additional_compile_targets': [
           'chromiumos_preflight',
         ],
         'test_suites': {
-          'gtest_tests': 'chromeos_device_kevin_tests',
+          'gtest_tests': 'chromeos_device_tests',
         },
         'swarming': {
           'dimension_sets': [
@@ -641,26 +659,15 @@
   {
     'name': 'chromium.android.fyi',
     'machines': {
-      'Android WebView O NetworkService (dbg)': {
+      'Android WebView P FYI (rel)': {
+        'mixins': [
+          'pie_fleet',
+          'walleye',
+        ],
         'test_suites': {
           'gtest_tests': 'webview_cts_tests_gtest',
         },
-        'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.network_webview_CTS_test.filter',
-          '--enable-features=NetworkService,NetworkServiceInProcess',
-        ],
-        'swarming': {
-          'dimension_sets': [
-            {
-              'device_os': 'OPR3.170623.008',
-              'device_os_flavor': 'google',
-              'device_type': 'marlin',
-              'os': 'Android',
-            },
-          ],
-        },
         'use_swarming': True,
-        'use_android_presentation': True,
         'os_type': 'android',
       },
       'Memory Infra Tester': {
@@ -769,7 +776,7 @@
           ],
         },
         'test_suites': {
-          'gtest_tests': 'chromeos_device_kevin_tests',
+          'gtest_tests': 'chromeos_device_tests',
           'isolated_scripts': 'chromeos_remote_device_isolated_tests',
         },
         'os_type': 'chromeos',
@@ -2758,7 +2765,7 @@
           'linux_intel_hd_630',
         ],
         'test_suites': {
-          'gtest_tests': 'gpu_fyi_linux_skia_renderer_gtests',
+          'gtest_tests': 'gpu_fyi_vulkan_gtests',
           'isolated_scripts': 'gpu_blink_web_tests',
           'gpu_telemetry_tests': 'gpu_skia_renderer_telemetry_tests',
         },
@@ -2770,7 +2777,7 @@
           'linux_nvidia_quadro_p400',
         ],
         'test_suites': {
-          'gtest_tests': 'gpu_fyi_linux_skia_renderer_gtests',
+          'gtest_tests': 'gpu_fyi_vulkan_gtests',
           'isolated_scripts': 'gpu_blink_web_tests',
           'gpu_telemetry_tests': 'gpu_skia_renderer_telemetry_tests',
         },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index a91bb23..a74a666 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -2641,6 +2641,25 @@
             ]
         }
     ],
+    "GenerationNoOverwrites": [
+        {
+            "platforms": [
+                "windows",
+                "mac",
+                "chromeos",
+                "linux",
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "GenerationNoOverwrites"
+                    ]
+                }
+            ]
+        }
+    ],
     "GestureNavigation": [
         {
             "platforms": [
diff --git a/third_party/blink/public/mojom/frame/document_interface_broker.mojom b/third_party/blink/public/mojom/frame/document_interface_broker.mojom
index 68d90163..c036ff4 100644
--- a/third_party/blink/public/mojom/frame/document_interface_broker.mojom
+++ b/third_party/blink/public/mojom/frame/document_interface_broker.mojom
@@ -4,34 +4,15 @@
 
 module blink.mojom;
 
-import "third_party/blink/public/mojom/credentialmanager/credential_manager.mojom";
 import "third_party/blink/public/mojom/frame/frame_host_test_interface.mojom";
-import "third_party/blink/public/mojom/webauthn/authenticator.mojom";
-import "third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom";
 
 // An interface through which the renderer may request document-scoped
 // interfaces from the browser.
 interface DocumentInterfaceBroker {
-  // Binds the blink.mojom.Authenticator pending receiver to its remote
-  // implementation in the browser process, to allow directing authenticators to
-  // create or use a public key credential.
-  GetAuthenticator(pending_receiver<blink.mojom.Authenticator> receiver);
-
-  // Binds the blink.mojom.CredentialManager pending receiver to its remote
-  // implementation in the browser process, to allow storing, retrieving and
-  // handling credentials.
-  GetCredentialManager(pending_receiver<blink.mojom.CredentialManager> receiver);
-
   // Binds the blink.mojom.FrameHostTestInterface pending receiver to its
   // remote implementation in the browser process, to allow using this test
   // interface to exercise requesting document-scoped interfaces from the
   // RenderFrameHost through the DocumentInterfaceBroker interface.
   GetFrameHostTestInterface(
       pending_receiver<blink.mojom.FrameHostTestInterface> receiver);
-
-  // Binds the blink.test.mojom.VirtualAuthenticatorManager pending receiver to
-  // its remote implementation in the browser process, to manage a virtual
-  // environment that allows talking virtual authenticators via the WebAuth API.
-  GetVirtualAuthenticatorManager(
-      pending_receiver<blink.test.mojom.VirtualAuthenticatorManager> receiver);
 };
diff --git a/third_party/blink/public/strings/blink_strings.grd b/third_party/blink/public/strings/blink_strings.grd
index f80f7f79..e2181a10 100644
--- a/third_party/blink/public/strings/blink_strings.grd
+++ b/third_party/blink/public/strings/blink_strings.grd
@@ -477,8 +477,9 @@
       <message name="IDS_AX_ROLE_MAIN_CONTENT" desc="Accessibility role description for main content of the document.">
         main
       </message>
+      <!-- https://w3c.github.io/html-aam/#el-mark -->
       <message name="IDS_AX_ROLE_MARK" desc="Accessibility role description for highlighted content.">
-        highlighted content
+        highlight
       </message>
       <message name="IDS_AX_ROLE_MATH" desc="Accessibility role description for math">
         math
diff --git a/third_party/blink/renderer/core/content_capture/content_capture_task.cc b/third_party/blink/renderer/core/content_capture/content_capture_task.cc
index a6d0a07..1f62be1 100644
--- a/third_party/blink/renderer/core/content_capture/content_capture_task.cc
+++ b/third_party/blink/renderer/core/content_capture/content_capture_task.cc
@@ -196,7 +196,7 @@
 }
 
 void ContentCaptureTask::Run(TimerBase*) {
-  TRACE_EVENT0("blink", "CaptureContentTask::Run");
+  TRACE_EVENT0("content-capture", "RunTask");
   is_scheduled_ = false;
   if (!RunInternal()) {
     ScheduleInternal(ScheduleReason::kRetryTask);
@@ -229,6 +229,8 @@
 
   delay_task_->StartOneShot(delay, FROM_HERE);
   is_scheduled_ = true;
+  TRACE_EVENT_INSTANT1("content-capture", "ScheduleTask",
+                       TRACE_EVENT_SCOPE_THREAD, "reason", reason);
 }
 
 void ContentCaptureTask::Schedule(ScheduleReason reason) {
diff --git a/third_party/blink/renderer/core/css/remote_font_face_source.cc b/third_party/blink/renderer/core/css/remote_font_face_source.cc
index 34bc02d..9655879 100644
--- a/third_party/blink/renderer/core/css/remote_font_face_source.cc
+++ b/third_party/blink/renderer/core/css/remote_font_face_source.cc
@@ -222,7 +222,7 @@
     return false;
 
   WebEffectiveConnectionType connection_type =
-      document->GetFrame()->Client()->GetEffectiveConnectionType();
+      GetNetworkStateNotifier().EffectiveType();
 
   bool network_is_slow =
       WebEffectiveConnectionType::kTypeOffline <= connection_type &&
diff --git a/third_party/blink/renderer/core/exported/local_frame_client_impl.cc b/third_party/blink/renderer/core/exported/local_frame_client_impl.cc
index da7e5fe2..2652245 100644
--- a/third_party/blink/renderer/core/exported/local_frame_client_impl.cc
+++ b/third_party/blink/renderer/core/exported/local_frame_client_impl.cc
@@ -1032,18 +1032,6 @@
   return nullptr;
 }
 
-WebEffectiveConnectionType LocalFrameClientImpl::GetEffectiveConnectionType() {
-  if (web_frame_->Client())
-    return web_frame_->Client()->GetEffectiveConnectionType();
-  return WebEffectiveConnectionType::kTypeUnknown;
-}
-
-void LocalFrameClientImpl::SetEffectiveConnectionTypeForTesting(
-    WebEffectiveConnectionType type) {
-  if (web_frame_->Client())
-    return web_frame_->Client()->SetEffectiveConnectionTypeForTesting(type);
-}
-
 WebURLRequest::PreviewsState LocalFrameClientImpl::GetPreviewsStateForFrame()
     const {
   if (web_frame_->Client())
diff --git a/third_party/blink/renderer/core/exported/local_frame_client_impl.h b/third_party/blink/renderer/core/exported/local_frame_client_impl.h
index 6a244821..a7e1a80 100644
--- a/third_party/blink/renderer/core/exported/local_frame_client_impl.h
+++ b/third_party/blink/renderer/core/exported/local_frame_client_impl.h
@@ -240,10 +240,6 @@
 
   BlameContext* GetFrameBlameContext() override;
 
-  WebEffectiveConnectionType GetEffectiveConnectionType() override;
-  void SetEffectiveConnectionTypeForTesting(
-      WebEffectiveConnectionType) override;
-
   WebURLRequest::PreviewsState GetPreviewsStateForFrame() const override;
 
   KURL OverrideFlashEmbedWithHTML(const KURL&) override;
diff --git a/third_party/blink/renderer/core/frame/local_frame_client.h b/third_party/blink/renderer/core/frame/local_frame_client.h
index 46def0c..075f067 100644
--- a/third_party/blink/renderer/core/frame/local_frame_client.h
+++ b/third_party/blink/renderer/core/frame/local_frame_client.h
@@ -382,14 +382,6 @@
       bool present,
       WebSuddenTerminationDisablerType) {}
 
-  // Effective connection type when this frame was loaded.
-  virtual WebEffectiveConnectionType GetEffectiveConnectionType() {
-    return WebEffectiveConnectionType::kTypeUnknown;
-  }
-  // Overrides the effective connection type for testing.
-  virtual void SetEffectiveConnectionTypeForTesting(
-      WebEffectiveConnectionType) {}
-
   // Returns the PreviewsState active for the frame.
   virtual WebURLRequest::PreviewsState GetPreviewsStateForFrame() const {
     return WebURLRequest::kPreviewsUnspecified;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
index 2c496989..e784567 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
@@ -802,22 +802,27 @@
 
   auto* block_flow = DynamicTo<LayoutBlockFlow>(box_);
   LayoutMultiColumnFlowThread* flow_thread = GetFlowThread(block_flow);
-  if (UNLIKELY(flow_thread)) {
-    PlaceChildrenInFlowThread(physical_fragment);
-  } else {
-    PhysicalOffset offset_from_start;
-    if (UNLIKELY(constraint_space.HasBlockFragmentation())) {
-      // Need to include any block space that this container has used in
-      // previous fragmentainers. The offset of children will be relative to
-      // the container, in flow thread coordinates, i.e. the model where
-      // everything is represented as one single strip, rather than being
-      // sliced and translated into columns.
 
-      // TODO(mstensho): writing modes
-      if (previous_break_token)
-        offset_from_start.top = previous_break_token->ConsumedBlockSize();
+  // Position the children inside the box. We skip this if display-lock prevents
+  // child layout.
+  if (!LayoutBlockedByDisplayLock(DisplayLockLifecycleTarget::kChildren)) {
+    if (UNLIKELY(flow_thread)) {
+      PlaceChildrenInFlowThread(physical_fragment);
+    } else {
+      PhysicalOffset offset_from_start;
+      if (UNLIKELY(constraint_space.HasBlockFragmentation())) {
+        // Need to include any block space that this container has used in
+        // previous fragmentainers. The offset of children will be relative to
+        // the container, in flow thread coordinates, i.e. the model where
+        // everything is represented as one single strip, rather than being
+        // sliced and translated into columns.
+
+        // TODO(mstensho): writing modes
+        if (previous_break_token)
+          offset_from_start.top = previous_break_token->ConsumedBlockSize();
+      }
+      PlaceChildrenInLayoutBox(physical_fragment, offset_from_start);
     }
-    PlaceChildrenInLayoutBox(physical_fragment, offset_from_start);
   }
 
   LayoutBlock* block = DynamicTo<LayoutBlock>(box_);
diff --git a/third_party/blink/renderer/core/script/document_write_intervention.cc b/third_party/blink/renderer/core/script/document_write_intervention.cc
index e4bb7522..d86a3a1 100644
--- a/third_party/blink/renderer/core/script/document_write_intervention.cc
+++ b/third_party/blink/renderer/core/script/document_write_intervention.cc
@@ -187,9 +187,8 @@
   document.Loader()->DidObserveLoadingBehavior(
       WebLoadingBehaviorFlag::kWebLoadingBehaviorDocumentWriteBlock);
 
-  if (!ShouldDisallowFetch(
-          settings, GetNetworkStateNotifier().ConnectionType(),
-          document.GetFrame()->Client()->GetEffectiveConnectionType())) {
+  if (!ShouldDisallowFetch(settings, GetNetworkStateNotifier().ConnectionType(),
+                           GetNetworkStateNotifier().EffectiveType())) {
     AddWarningHeader(&params);
     return false;
   }
diff --git a/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc b/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc
index 1ae15c4..ea2b3a3 100644
--- a/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc
+++ b/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc
@@ -816,12 +816,10 @@
          std::min(max_value, std::max(min_value, preliminary_active_duration));
 }
 
-SMILInterval SVGSMILElement::ResolveInterval(
-    IntervalSelector interval_selector) const {
-  bool first = interval_selector == kFirstInterval;
+SMILInterval SVGSMILElement::ResolveInterval(SMILTime begin_after,
+                                             SMILTime end_after) const {
   // Simplified version of the pseudocode in
   // http://www.w3.org/TR/SMIL3/smil-timing.html#q90.
-  SMILTime begin_after = first ? SMILTime::Earliest() : interval_.end;
   while (true) {
     SMILTime temp_begin = FindInstanceTime(kBegin, begin_after, true);
     if (temp_begin.IsUnresolved())
@@ -835,9 +833,10 @@
     temp_end = ResolveActiveEnd(temp_begin, temp_end);
     // If this is the first interval being resolved, don't allow it to end
     // before the origin of the timeline.
-    // TODO(fs): Don't resolve intervals that end "in the past".
-    if (!first || temp_end > SMILTime())
+    if (temp_end > end_after) {
+      DCHECK(!temp_begin.IsIndefinite());
       return SMILInterval(temp_begin, temp_end);
+    }
 
     begin_after = temp_end;
   }
@@ -845,8 +844,8 @@
 }
 
 bool SVGSMILElement::ResolveFirstInterval() {
-  SMILInterval first_interval = ResolveInterval(kFirstInterval);
-  DCHECK(!first_interval.begin.IsIndefinite());
+  SMILInterval first_interval =
+      ResolveInterval(SMILTime::Earliest(), SMILTime());
   if (!first_interval.IsResolved() || first_interval == interval_)
     return false;
   interval_ = first_interval;
@@ -854,18 +853,6 @@
   return true;
 }
 
-base::Optional<SMILInterval> SVGSMILElement::ResolveNextInterval() {
-  SMILInterval next_interval = ResolveInterval(kNextInterval);
-  DCHECK(!next_interval.begin.IsIndefinite());
-
-  if (!next_interval.begin.IsUnresolved() &&
-      next_interval.begin != interval_.begin) {
-    return next_interval;
-  }
-
-  return base::nullopt;
-}
-
 SMILTime SVGSMILElement::NextInterestingTime(SMILTime presentation_time) const {
   DCHECK_GE(presentation_time, SMILTime());
   SMILTime next_interesting_interval_time = SMILTime::Indefinite();
@@ -904,8 +891,7 @@
     return;
   // Begin time changed, re-resolve the interval.
   SMILTime old_begin = interval_.begin;
-  interval_.end = event_time;
-  interval_ = ResolveInterval(kNextInterval);
+  interval_ = ResolveInterval(event_time, event_time);
   DCHECK(interval_.IsResolved());
   if (interval_.begin != old_begin) {
     if (GetActiveState() == kActive && interval_.BeginsAfter(event_time)) {
@@ -955,7 +941,9 @@
 
   if ((new_interval && new_interval->EndsBefore(elapsed)) ||
       (!new_interval && interval_.EndsBefore(elapsed))) {
-    new_interval = ResolveNextInterval();
+    SMILInterval next_interval = ResolveInterval(interval_.end, elapsed);
+    if (next_interval.IsResolved() && next_interval.begin != interval_.begin)
+      new_interval = next_interval;
   }
 
   if (new_interval) {
diff --git a/third_party/blink/renderer/core/svg/animation/svg_smil_element.h b/third_party/blink/renderer/core/svg/animation/svg_smil_element.h
index fd11d50..769b072 100644
--- a/third_party/blink/renderer/core/svg/animation/svg_smil_element.h
+++ b/third_party/blink/renderer/core/svg/animation/svg_smil_element.h
@@ -176,11 +176,8 @@
                             SMILTime minimum_time,
                             bool equals_minimum_ok) const;
 
-  enum IntervalSelector { kFirstInterval, kNextInterval };
-
-  SMILInterval ResolveInterval(IntervalSelector) const;
+  SMILInterval ResolveInterval(SMILTime begin_after, SMILTime end_after) const;
   bool ResolveFirstInterval();
-  base::Optional<SMILInterval> ResolveNextInterval();
   SMILTime ResolveActiveEnd(SMILTime resolved_begin,
                             SMILTime resolved_end) const;
   SMILTime RepeatingDuration() const;
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 721f1201..0555faa 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -1601,7 +1601,11 @@
 
   if (IsNativeTextControl() &&
       (IsHTMLTextAreaElement(*node) || IsHTMLInputElement(*node))) {
-    return ToTextControl(*node).value();
+    // We should not simply return the "value" attribute because it might be
+    // sanitized in some input control types, e.g. email fields. If we do that,
+    // then "selectionStart" and "selectionEnd" indices will not match with the
+    // text in the sanitized value.
+    return ToTextControl(*node).InnerEditorValue();
   }
 
   auto* element = DynamicTo<Element>(node);
@@ -2951,7 +2955,7 @@
 
   // 5.2 input type="button", input type="submit" and input type="reset"
   if (input_element && input_element->IsTextButton()) {
-    // value attribue
+    // value attribute.
     name_from = ax::mojom::NameFrom::kValue;
     if (name_sources) {
       name_sources->push_back(NameSource(*found_text_alternative, kValueAttr));
@@ -3017,7 +3021,7 @@
       }
     }
 
-    // value attr
+    // value attribute.
     if (name_sources) {
       name_sources->push_back(NameSource(*found_text_alternative, kValueAttr));
       name_sources->back().type = name_from;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_position.cc b/third_party/blink/renderer/modules/accessibility/ax_position.cc
index 548009a..15ebb4b 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_position.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_position.cc
@@ -41,7 +41,7 @@
   AXPosition position(*parent);
   position.text_offset_or_child_index_ = child.IndexInParent();
 #if DCHECK_IS_ON()
-  std::string failure_reason;
+  String failure_reason;
   DCHECK(position.IsValid(&failure_reason)) << failure_reason;
 #endif
   return position.AsUnignoredPosition(adjustment_behavior);
@@ -66,7 +66,7 @@
   AXPosition position(*parent);
   position.text_offset_or_child_index_ = child.IndexInParent() + 1;
 #if DCHECK_IS_ON()
-  std::string failure_reason;
+  String failure_reason;
   DCHECK(position.IsValid(&failure_reason)) << failure_reason;
 #endif
   return position.AsUnignoredPosition(adjustment_behavior);
@@ -83,7 +83,7 @@
     AXPosition position(container);
     position.text_offset_or_child_index_ = 0;
 #if DCHECK_IS_ON()
-    std::string failure_reason;
+    String failure_reason;
     DCHECK(position.IsValid(&failure_reason)) << failure_reason;
 #endif
     return position.AsUnignoredPosition(adjustment_behavior);
@@ -100,7 +100,7 @@
   AXPosition position(*unignored_container);
   position.text_offset_or_child_index_ = 0;
 #if DCHECK_IS_ON()
-  std::string failure_reason;
+  String failure_reason;
   DCHECK(position.IsValid(&failure_reason)) << failure_reason;
 #endif
   return position.AsUnignoredPosition(adjustment_behavior);
@@ -117,7 +117,7 @@
     AXPosition position(container);
     position.text_offset_or_child_index_ = position.MaxTextOffset();
 #if DCHECK_IS_ON()
-    std::string failure_reason;
+    String failure_reason;
     DCHECK(position.IsValid(&failure_reason)) << failure_reason;
 #endif
     return position.AsUnignoredPosition(adjustment_behavior);
@@ -134,7 +134,7 @@
   AXPosition position(*unignored_container);
   position.text_offset_or_child_index_ = unignored_container->ChildCount();
 #if DCHECK_IS_ON()
-  std::string failure_reason;
+  String failure_reason;
   DCHECK(position.IsValid(&failure_reason)) << failure_reason;
 #endif
   return position.AsUnignoredPosition(adjustment_behavior);
@@ -155,7 +155,7 @@
   position.text_offset_or_child_index_ = offset;
   position.affinity_ = affinity;
 #if DCHECK_IS_ON()
-  std::string failure_reason;
+  String failure_reason;
   DCHECK(position.IsValid(&failure_reason)) << failure_reason;
 #endif
   return position.AsUnignoredPosition(adjustment_behavior);
@@ -240,7 +240,7 @@
     ax_position.text_offset_or_child_index_ = offset;
     ax_position.affinity_ = affinity;
 #if DCHECK_IS_ON()
-    std::string failure_reason;
+    String failure_reason;
     DCHECK(ax_position.IsValid(&failure_reason)) << failure_reason;
 #endif
     return ax_position;
@@ -416,43 +416,51 @@
   return affinity_;
 }
 
-bool AXPosition::IsValid(std::string* failure_reason) const {
+bool AXPosition::IsValid(String* failure_reason) const {
   if (!container_object_) {
     if (failure_reason)
-      *failure_reason += "\nPosition invalid: no container object";
+      *failure_reason = "\nPosition invalid: no container object.";
     return false;
   }
   if (container_object_->IsDetached()) {
     if (failure_reason)
-      *failure_reason += "\nPosition invalid: detached container object";
+      *failure_reason = "\nPosition invalid: detached container object.";
     return false;
   }
   if (!container_object_->GetDocument()) {
-    if (failure_reason)
-      *failure_reason += "\nPosition invalid: no document for container object";
+    if (failure_reason) {
+      *failure_reason = "\nPosition invalid: no document for container object.";
+    }
     return false;
   }
+
   // Some container objects, such as those for CSS "::before" and "::after"
   // text, don't have associated DOM nodes.
   if (container_object_->GetNode() &&
       !container_object_->GetNode()->isConnected()) {
     if (failure_reason) {
-      *failure_reason +=
-          "\nPosition invalid: container object node is disconnected";
+      *failure_reason =
+          "\nPosition invalid: container object node is disconnected.";
     }
     return false;
   }
 
   if (IsTextPosition()) {
     if (text_offset_or_child_index_ > MaxTextOffset()) {
-      if (failure_reason)
-        *failure_reason += "\nPosition invalid: text offset too large";
+      if (failure_reason) {
+        *failure_reason = String::Format(
+            "\nPosition invalid: text offset too large.\n%d vs. %d",
+            text_offset_or_child_index_, MaxTextOffset());
+      }
       return false;
     }
   } else {
     if (text_offset_or_child_index_ > container_object_->ChildCount()) {
-      if (failure_reason)
-        *failure_reason += "\nPosition invalid: child index too large";
+      if (failure_reason) {
+        *failure_reason = String::Format(
+            "\nPosition invalid: child index too large.\n%d vs. %d",
+            text_offset_or_child_index_, container_object_->ChildCount());
+      }
       return false;
     }
   }
@@ -726,7 +734,7 @@
     }
   }
 #if DCHECK_IS_ON()
-  std::string failure_reason;
+  String failure_reason;
   DCHECK(position.IsValid(&failure_reason)) << failure_reason;
 #endif
   return position.AsValidDOMPosition(adjustment_behavior);
@@ -869,7 +877,7 @@
 
 bool operator==(const AXPosition& a, const AXPosition& b) {
 #if DCHECK_IS_ON()
-  std::string failure_reason;
+  String failure_reason;
   DCHECK(a.IsValid(&failure_reason) && b.IsValid(&failure_reason))
       << failure_reason;
 #endif
@@ -890,7 +898,7 @@
 
 bool operator<(const AXPosition& a, const AXPosition& b) {
 #if DCHECK_IS_ON()
-  std::string failure_reason;
+  String failure_reason;
   DCHECK(a.IsValid(&failure_reason) && b.IsValid(&failure_reason))
       << failure_reason;
 #endif
@@ -931,7 +939,7 @@
 
 bool operator>(const AXPosition& a, const AXPosition& b) {
 #if DCHECK_IS_ON()
-  std::string failure_reason;
+  String failure_reason;
   DCHECK(a.IsValid(&failure_reason) && b.IsValid(&failure_reason))
       << failure_reason;
 #endif
diff --git a/third_party/blink/renderer/modules/accessibility/ax_position.h b/third_party/blink/renderer/modules/accessibility/ax_position.h
index b5e3612..ff96bb0 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_position.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_position.h
@@ -114,7 +114,7 @@
 
   // Verifies if the anchor is present and if it's set to a live object with a
   // connected node.
-  bool IsValid(std::string* failure_reason = nullptr) const;
+  bool IsValid(String* failure_reason = nullptr) const;
 
   operator bool() const { return IsValid(); }
 
diff --git a/third_party/blink/renderer/modules/accessibility/ax_selection_test.cc b/third_party/blink/renderer/modules/accessibility/ax_selection_test.cc
index 0f27d24..c5423b2 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_selection_test.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_selection_test.cc
@@ -1122,13 +1122,14 @@
   ASSERT_NE(nullptr, input);
   ASSERT_TRUE(IsTextControl(input));
   TextControlElement& text_control = ToTextControl(*input);
-  ASSERT_LE(1u, text_control.value().length());
+  ASSERT_LE(1u, text_control.InnerEditorValue().length());
 
   const AXObject* ax_input = GetAXObjectByElementId("input");
   ASSERT_NE(nullptr, ax_input);
   ASSERT_EQ(ax::mojom::Role::kTextField, ax_input->RoleValue());
 
-  for (unsigned int i = 0; i < text_control.value().length() - 1; ++i) {
+  for (unsigned int i = 0; i < text_control.InnerEditorValue().length() - 1;
+       ++i) {
     AXSelection::Builder builder;
     AXSelection ax_selection =
         builder.SetBase(AXPosition::CreatePositionInTextObject(*ax_input, i))
@@ -1137,7 +1138,7 @@
 
     testing::Message message;
     message << "While selecting forward character "
-            << char{text_control.value()[i]} << " at position " << i
+            << char{text_control.InnerEditorValue()[i]} << " at position " << i
             << " in text field.";
     SCOPED_TRACE(message);
     EXPECT_TRUE(ax_selection.Select());
@@ -1147,7 +1148,7 @@
     EXPECT_EQ("forward", text_control.selectionDirection());
   }
 
-  for (unsigned int i = text_control.value().length(); i > 0; --i) {
+  for (unsigned int i = text_control.InnerEditorValue().length(); i > 0; --i) {
     AXSelection::Builder builder;
     AXSelection ax_selection =
         builder.SetBase(AXPosition::CreatePositionInTextObject(*ax_input, i))
@@ -1156,7 +1157,83 @@
 
     testing::Message message;
     message << "While selecting backward character "
-            << char{text_control.value()[i]} << " at position " << i
+            << char{text_control.InnerEditorValue()[i]} << " at position " << i
+            << " in text field.";
+    SCOPED_TRACE(message);
+    EXPECT_TRUE(ax_selection.Select());
+
+    EXPECT_EQ(i - 1, text_control.selectionStart());
+    EXPECT_EQ(i, text_control.selectionEnd());
+    EXPECT_EQ("backward", text_control.selectionDirection());
+  }
+}
+
+TEST_F(AccessibilitySelectionTest,
+       SelectEachConsecutiveCharacterInEmailFieldWithInvalidAddress) {
+  GetPage().GetSettings().SetScriptEnabled(true);
+  String valid_email = "valid@example.com";
+  SetBodyInnerHTML(R"HTML(
+      <input id="input" type="email" value=)HTML" +
+                   valid_email + R"HTML(>
+      )HTML");
+
+  // Add three spaces to the start of the address to make it invalid.
+  Element* const script_element =
+      GetDocument().CreateRawElement(html_names::kScriptTag);
+  ASSERT_NE(nullptr, script_element);
+  script_element->setTextContent(R"SCRIPT(
+      let input = document.querySelector('input');
+      input.focus();
+      input.value = input.value.padStart(3, ' ');
+      input.selectionStart = 0;
+      input.selectionEnd = input.value.length;
+      )SCRIPT");
+  GetDocument().body()->AppendChild(script_element);
+  UpdateAllLifecyclePhasesForTest();
+
+  Element* const input = GetDocument().QuerySelector("input");
+  ASSERT_NE(nullptr, input);
+  ASSERT_TRUE(IsTextControl(input));
+  TextControlElement& text_control = ToTextControl(*input);
+  // The "value" attribute should not contain the extra spaces.
+  ASSERT_EQ(valid_email.length(), text_control.value().length());
+
+  const AXObject* ax_input = GetAXObjectByElementId("input");
+  ASSERT_NE(nullptr, ax_input);
+  ASSERT_EQ(ax::mojom::Role::kTextField, ax_input->RoleValue());
+
+  // The address can still be navigated using cursor left / right, even though
+  // it's invalid.
+  for (unsigned int i = 0; i < text_control.InnerEditorValue().length() - 1;
+       ++i) {
+    AXSelection::Builder builder;
+    AXSelection ax_selection =
+        builder.SetBase(AXPosition::CreatePositionInTextObject(*ax_input, i))
+            .SetExtent(AXPosition::CreatePositionInTextObject(*ax_input, i + 1))
+            .Build();
+
+    testing::Message message;
+    message << "While selecting forward character "
+            << char{text_control.InnerEditorValue()[i]} << " at position " << i
+            << " in text field.";
+    SCOPED_TRACE(message);
+    EXPECT_TRUE(ax_selection.Select());
+
+    EXPECT_EQ(i, text_control.selectionStart());
+    EXPECT_EQ(i + 1, text_control.selectionEnd());
+    EXPECT_EQ("forward", text_control.selectionDirection());
+  }
+
+  for (unsigned int i = text_control.InnerEditorValue().length(); i > 0; --i) {
+    AXSelection::Builder builder;
+    AXSelection ax_selection =
+        builder.SetBase(AXPosition::CreatePositionInTextObject(*ax_input, i))
+            .SetExtent(AXPosition::CreatePositionInTextObject(*ax_input, i - 1))
+            .Build();
+
+    testing::Message message;
+    message << "While selecting backward character "
+            << char{text_control.InnerEditorValue()[i]} << " at position " << i
             << " in text field.";
     SCOPED_TRACE(message);
     EXPECT_TRUE(ax_selection.Select());
diff --git a/third_party/blink/renderer/modules/credentialmanager/credential_manager_proxy.cc b/third_party/blink/renderer/modules/credentialmanager/credential_manager_proxy.cc
index 26a19db1af..0824e84 100644
--- a/third_party/blink/renderer/modules/credentialmanager/credential_manager_proxy.cc
+++ b/third_party/blink/renderer/modules/credentialmanager/credential_manager_proxy.cc
@@ -4,8 +4,7 @@
 
 #include "third_party/blink/renderer/modules/credentialmanager/credential_manager_proxy.h"
 
-#include "services/service_manager/public/cpp/interface_provider.h"
-#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-blink.h"
+#include "third_party/blink/public/common/browser_interface_broker_proxy.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
@@ -16,10 +15,10 @@
 CredentialManagerProxy::CredentialManagerProxy(Document& document) {
   LocalFrame* frame = document.GetFrame();
   DCHECK(frame);
-  frame->GetDocumentInterfaceBroker().GetCredentialManager(
+  frame->GetBrowserInterfaceBroker().GetInterface(
       credential_manager_.BindNewPipeAndPassReceiver(
           frame->GetTaskRunner(TaskType::kUserInteraction)));
-  frame->GetDocumentInterfaceBroker().GetAuthenticator(
+  frame->GetBrowserInterfaceBroker().GetInterface(
       authenticator_.BindNewPipeAndPassReceiver(
           frame->GetTaskRunner(TaskType::kUserInteraction)));
 }
diff --git a/third_party/blink/renderer/modules/credentialmanager/credentials_container_test.cc b/third_party/blink/renderer/modules/credentialmanager/credentials_container_test.cc
index 72be464..2b52ef0 100644
--- a/third_party/blink/renderer/modules/credentialmanager/credentials_container_test.cc
+++ b/third_party/blink/renderer/modules/credentialmanager/credentials_container_test.cc
@@ -13,6 +13,7 @@
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/browser_interface_broker_proxy.h"
 #include "third_party/blink/public/mojom/credentialmanager/credential_manager.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_gc_controller.h"
@@ -21,7 +22,6 @@
 #include "third_party/blink/renderer/core/frame/frame_test_helpers.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/testing/gc_object_liveness_observer.h"
-#include "third_party/blink/renderer/core/testing/test_document_interface_broker.h"
 #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h"
 #include "third_party/blink/renderer/modules/credentialmanager/credential.h"
 #include "third_party/blink/renderer/modules/credentialmanager/credential_creation_options.h"
@@ -99,30 +99,6 @@
   DISALLOW_COPY_AND_ASSIGN(MockCredentialManager);
 };
 
-class MockCredentialManagerDocumentInterfaceBroker
-    : public TestDocumentInterfaceBroker {
- public:
-  MockCredentialManagerDocumentInterfaceBroker(
-      mojom::blink::DocumentInterfaceBroker* document_interface_broker,
-      mojo::PendingReceiver<mojom::blink::DocumentInterfaceBroker> receiver,
-      MockCredentialManager* mock_credential_manager)
-      : TestDocumentInterfaceBroker(document_interface_broker,
-                                    std::move(receiver)),
-        mock_credential_manager_(mock_credential_manager) {}
-
-  void GetCredentialManager(
-      mojo::PendingReceiver<::blink::mojom::blink::CredentialManager> receiver)
-      override {
-    mock_credential_manager_->Bind(std::move(receiver));
-  }
-
-  void GetAuthenticator(
-      mojo::PendingReceiver<mojom::blink::Authenticator> receiver) override {}
-
- private:
-  MockCredentialManager* mock_credential_manager_;
-};
-
 class CredentialManagerTestingContext {
   STACK_ALLOCATED();
 
@@ -132,12 +108,23 @@
       : dummy_context_(KURL("https://example.test")) {
     dummy_context_.GetDocument().SetSecureContextStateForTesting(
         SecureContextState::kSecure);
-    mojo::PendingRemote<mojom::blink::DocumentInterfaceBroker> doc;
-    broker_ = std::make_unique<MockCredentialManagerDocumentInterfaceBroker>(
-        &dummy_context_.GetFrame().GetDocumentInterfaceBroker(),
-        doc.InitWithNewPipeAndPassReceiver(), mock_credential_manager);
-    dummy_context_.GetFrame().SetDocumentInterfaceBrokerForTesting(
-        doc.PassPipe());
+
+    dummy_context_.GetFrame().GetBrowserInterfaceBroker().SetBinderForTesting(
+        ::blink::mojom::blink::CredentialManager::Name_,
+        WTF::BindRepeating(
+            [](MockCredentialManager* mock_credential_manager,
+               mojo::ScopedMessagePipeHandle handle) {
+              mock_credential_manager->Bind(
+                  mojo::PendingReceiver<
+                      ::blink::mojom::blink::CredentialManager>(
+                      std::move(handle)));
+            },
+            WTF::Unretained(mock_credential_manager)));
+  }
+
+  ~CredentialManagerTestingContext() {
+    dummy_context_.GetFrame().GetBrowserInterfaceBroker().SetBinderForTesting(
+        ::blink::mojom::blink::CredentialManager::Name_, {});
   }
 
   Document* GetDocument() { return &dummy_context_.GetDocument(); }
@@ -146,7 +133,6 @@
 
  private:
   V8TestingScope dummy_context_;
-  std::unique_ptr<MockCredentialManagerDocumentInterfaceBroker> broker_;
 };
 
 }  // namespace
diff --git a/third_party/blink/renderer/modules/netinfo/testing/internals_net_info.cc b/third_party/blink/renderer/modules/netinfo/testing/internals_net_info.cc
index df7f64f..b4a199e 100644
--- a/third_party/blink/renderer/modules/netinfo/testing/internals_net_info.cc
+++ b/third_party/blink/renderer/modules/netinfo/testing/internals_net_info.cc
@@ -70,8 +70,6 @@
   }
   GetNetworkStateNotifier().SetNetworkConnectionInfoOverride(
       on_line, webtype, web_effective_type, http_rtt_msec, downlink_max_mbps);
-  internals.GetFrame()->Client()->SetEffectiveConnectionTypeForTesting(
-      web_effective_type);
 }
 
 void InternalsNetInfo::setSaveDataEnabled(Internals&, bool enabled) {
diff --git a/third_party/blink/web_tests/animations/interpolation/translate-interpolation.html b/third_party/blink/web_tests/animations/interpolation/translate-interpolation.html
deleted file mode 100644
index 4bce7ecf..0000000
--- a/third_party/blink/web_tests/animations/interpolation/translate-interpolation.html
+++ /dev/null
@@ -1,218 +0,0 @@
-<!DOCTYPE html>
-<meta charset="UTF-8">
-<style>
-.parent {
-  translate: 100px 200px 300px;
-}
-.target {
-  width: 100px;
-  height: 100px;
-  background-color: black;
-  translate: 10px;
-}
-.expected {
-  background-color: green;
-}
-</style>
-<template id="target-template">
-<div class="parent">
-    <div class="target"></div>
-</div>
-</template>
-<script src="resources/interpolation-test.js"></script>
-<script>
-assertInterpolation({
-  property: 'translate',
-  from: 'none',
-  to: '300px 200px 100px',
-}, [
-  {at: -1, is: '-300px -200px -100px'},
-  {at: 0, is: 'none'},
-  {at: 0.25, is: '75px 50px 25px'},
-  {at: 0.75, is: '225px 150px 75px'},
-  {at: 1, is: '300px 200px 100px'},
-  {at: 2, is: '600px 400px 200px'},
-]);
-
-assertInterpolation({
-  property: 'translate',
-  from: neutralKeyframe,
-  to: '20px',
-}, [
-  {at: -1, is: '0px'},
-  {at: 0, is: '10px'},
-  {at: 0.25, is: '12.5px'},
-  {at: 0.75, is: '17.5px'},
-  {at: 1, is: '20px'},
-  {at: 2, is: '30px'},
-]);
-
-assertInterpolation({
-  property: 'translate',
-  from: 'unset',
-  to: '20px',
-}, [
-  {at: -1, is: '-20px'},
-  {at: 0, is: 'none'},
-  {at: 0.25, is: '5px'},
-  {at: 0.75, is: '15px'},
-  {at: 1, is: '20px'},
-  {at: 2, is: '40px'},
-]);
-
-assertInterpolation({
-  property: 'translate',
-  from: '-100px',
-  to: '100px',
-}, [
-  {at: -1, is: '-300px'},
-  {at: 0, is: '-100px'},
-  {at: 0.25, is: '-50px'},
-  {at: 0.75, is: '50px'},
-  {at: 1, is: '100px'},
-  {at: 2, is: '300px'},
-]);
-
-assertInterpolation({
-  property: 'translate',
-  from: '-100%',
-  to: '100%',
-}, [
-  {at: -1, is: '-300%'},
-  {at: 0, is: '-100%'},
-  {at: 0.25, is: '-50%'},
-  {at: 0.75, is: '50%'},
-  {at: 1, is: '100%'},
-  {at: 2, is: '300%'},
-]);
-
-assertInterpolation({
-  property: 'translate',
-  from: '-100px -50px',
-  to: '100px 50px',
-}, [
-  {at: -1, is: '-300px -150px'},
-  {at: 0, is: '-100px -50px'},
-  {at: 0.25, is: '-50px -25px'},
-  {at: 0.75, is: '50px 25px'},
-  {at: 1, is: '100px 50px'},
-  {at: 2, is: '300px 150px'},
-]);
-
-assertInterpolation({
-  property: 'translate',
-  from: '-100px -50px 100px',
-  to: '100px 50px 0px',
-}, [
-  {at: -1, is: '-300px -150px 200px'},
-  {at: 0, is: '-100px -50px 100px'},
-  {at: 0.25, is: '-50px -25px 75px'},
-  {at: 0.75, is: '50px 25px 25px'},
-  {at: 1, is: '100px 50px 0px'},
-  {at: 2, is: '300px 150px -100px'},
-]);
-
-assertInterpolation({
-  property: 'translate',
-  from: '0px',
-  to: '-100px -50px 100px',
-}, [
-  {at: -1, is: '100px 50px -100px'},
-  {at: 0, is: '0px'},
-  {at: 0.25, is: '-25px -12.5px 25px'},
-  {at: 0.75, is: '-75px -37.5px 75px'},
-  {at: 1, is: '-100px -50px 100px'},
-  {at: 2, is: '-200px -100px 200px'},
-]);
-
-assertInterpolation({
-  property: 'translate',
-  from: '-100px -50px 100px',
-  to: '0px',
-}, [
-  {at: -1, is: '-200px -100px 200px'},
-  {at: 0, is: '-100px -50px 100px'},
-  {at: 0.25, is: '-75px -37.5px 75px'},
-  {at: 0.75, is: '-25px -12.5px 25px'},
-  {at: 1, is: '0px'},
-  {at: 2, is: '100px 50px -100px'},
-]);
-
-assertInterpolation({
-  property: 'translate',
-  from: 'inherit',
-  to: '200px 100px 200px',
-}, [
-  {at: -1, is: '0px 300px 400px'},
-  {at: 0, is: '100px 200px 300px'},
-  {at: 0.25, is: '125px 175px 275px'},
-  {at: 0.75, is: '175px 125px 225px'},
-  {at: 1, is: '200px 100px 200px'},
-  {at: 2, is: '300px 0px 100px'},
-]);
-
-assertInterpolation({
-  property: 'translate',
-  from: '200px 100px 200px',
-  to: 'inherit',
-}, [
-  {at: -1, is: '300px 0px 100px'},
-  {at: 0, is: '200px 100px 200px'},
-  {at: 0.25, is: '175px 125px 225px'},
-  {at: 0.75, is: '125px 175px 275px'},
-  {at: 1, is: '100px 200px 300px'},
-  {at: 2, is: '0px 300px 400px'},
-]);
-
-assertInterpolation({
-  property: 'translate',
-  from: 'initial',
-  to: '200px 100px 200px',
-}, [
-  {at: -1, is: '-200px -100px -200px'},
-  {at: 0, is: 'none'},
-  {at: 0.25, is: '50px 25px 50px'},
-  {at: 0.75, is: '150px 75px 150px'},
-  {at: 1, is: '200px 100px 200px'},
-  {at: 2, is: '400px 200px 400px'},
-]);
-
-assertInterpolation({
-  property: 'translate',
-  from: '200px 100px 400px',
-  to: 'initial',
-}, [
-  {at: -1, is: '400px 200px 800px'},
-  {at: 0, is: '200px 100px 400px'},
-  {at: 0.25, is: '150px 75px 300px'},
-  {at: 0.75, is: '50px 25px 100px'},
-  {at: 1, is: 'none'},
-  {at: 2, is: '-200px -100px -400px'},
-]);
-
-assertInterpolation({
-  property: 'translate',
-  from: 'initial',
-  to: 'inherit',
-}, [
-  {at: -1, is: '-100px -200px -300px'},
-  {at: 0, is: 'none'},
-  {at: 0.25, is: '25px 50px 75px'},
-  {at: 0.75, is: '75px 150px 225px'},
-  {at: 1, is: '100px 200px 300px'},
-  {at: 2, is: '200px 400px 600px'},
-]);
-
-assertInterpolation({
-  property: 'translate',
-  from: 'inherit',
-  to: 'initial',
-}, [
-  {at: -1, is: '200px 400px 600px'},
-  {at: 0, is: '100px 200px 300px'},
-  {at: 0.25, is: '75px 150px 225px'},
-  {at: 0.75, is: '25px 50px 75px'},
-  {at: 1, is: 'none'},
-  {at: 2, is: '-100px -200px -300px'},
-]);
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transforms/animation/translate-interpolation.html b/third_party/blink/web_tests/external/wpt/css/css-transforms/animation/translate-interpolation.html
index aed6c41..c73f68a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-transforms/animation/translate-interpolation.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-transforms/animation/translate-interpolation.html
@@ -18,10 +18,70 @@
         width: 10px;
         height: 10px;
       }
+      .parent {
+        translate: 100px 200px 300px;
+      }
+      .target {
+        width: 100px;
+        height: 100px;
+        background-color: black;
+        translate: 10px;
+      }
+      .expected {
+        background-color: green;
+      }
     </style>
   </head>
   <body>
+    <template id="target-template">
+      <div class="parent">
+          <div class="target"></div>
+      </div>
+    </template>
     <script>
+      // Matching one-length (pixels) animation.
+      test_interpolation({
+        property: 'translate',
+        from: '-100px',
+        to: '100px',
+      }, [
+        {at: -1, expect: '-300px'},
+        {at: 0, expect: '-100px'},
+        {at: 0.25, expect: '-50px'},
+        {at: 0.75, expect: '50px'},
+        {at: 1, expect: '100px'},
+        {at: 2, expect: '300px'},
+      ]);
+
+      // Matching one-length (percentage) animation.
+      test_interpolation({
+        property: 'translate',
+        from: '-100%',
+        to: '100%',
+      }, [
+        {at: -1, expect: '-300%'},
+        {at: 0, expect: '-100%'},
+        {at: 0.25, expect: '-50%'},
+        {at: 0.75, expect: '50%'},
+        {at: 1, expect: '100%'},
+        {at: 2, expect: '300%'},
+      ]);
+
+      // Matching two-length (all pixels) animation.
+      test_interpolation({
+        property: 'translate',
+        from: '-100px -50px',
+        to: '100px 50px',
+      }, [
+        {at: -1, expect: '-300px -150px'},
+        {at: 0, expect: '-100px -50px'},
+        {at: 0.25, expect: '-50px -25px'},
+        {at: 0.75, expect: '50px 25px'},
+        {at: 1, expect: '100px 50px'},
+        {at: 2, expect: '300px 150px'},
+      ]);
+
+      // Matching three-length (all pixels) animation.
       test_interpolation({
         property: 'translate',
         from: '220px 240px 260px',
@@ -35,6 +95,35 @@
         {at: 2, expect: '380px 560px 740px'}
       ]);
 
+      // Going from one length to three lengths.
+      test_interpolation({
+        property: 'translate',
+        from: '0px',
+        to: '-100px -50px 100px',
+      }, [
+        {at: -1, expect: '100px 50px -100px'},
+        {at: 0, expect: '0px'},
+        {at: 0.25, expect: '-25px -12.5px 25px'},
+        {at: 0.75, expect: '-75px -37.5px 75px'},
+        {at: 1, expect: '-100px -50px 100px'},
+        {at: 2, expect: '-200px -100px 200px'},
+      ]);
+
+      // Going from three lengths to one length.
+      test_interpolation({
+        property: 'translate',
+        from: '-100px -50px 100px',
+        to: '0px',
+      }, [
+        {at: -1, expect: '-200px -100px 200px'},
+        {at: 0, expect: '-100px -50px 100px'},
+        {at: 0.25, expect: '-75px -37.5px 75px'},
+        {at: 0.75, expect: '-25px -12.5px 25px'},
+        {at: 1, expect: '0px'},
+        {at: 2, expect: '100px 50px -100px'},
+      ]);
+
+      // Going from three-lengths to two-percentages.
       test_interpolation({
         property: 'translate',
         from: '480px 400px 320px',
@@ -48,6 +137,21 @@
         {at: 2, expect: 'calc(480% - 480px) calc(320% - 400px) -320px'}
       ]);
 
+      // Handling of the none value.
+      test_interpolation({
+        property: 'translate',
+        from: 'none',
+        to: 'none',
+      }, [
+        {at: -1, expect: 'none'},
+        {at: 0, expect: 'none'},
+        {at: 0.125, expect: 'none'},
+        {at: 0.875, expect: 'none'},
+        {at: 1, expect: 'none'},
+        {at: 2, expect: 'none'}
+      ]);
+
+      // Going from none to a valid value; test that it converts properly.
       test_interpolation({
         property: 'translate',
         from: 'none',
@@ -61,17 +165,114 @@
         {at: 2, expect: '16px 160% 1600px'}
       ]);
 
+      // Test neutral keyframe; make sure it adds the underlying.
       test_interpolation({
         property: 'translate',
-        from: 'none',
-        to: 'none',
+        from: neutralKeyframe,
+        to: '20px',
       }, [
-        {at: -1, expect: 'none'},
+        {at: -1, expect: '0px'},
+        {at: 0, expect: '10px'},
+        {at: 0.25, expect: '12.5px'},
+        {at: 0.75, expect: '17.5px'},
+        {at: 1, expect: '20px'},
+        {at: 2, expect: '30px'},
+      ]);
+
+      // Test initial value; for 'scale' this is 'none'.
+      test_interpolation({
+        property: 'translate',
+        from: 'initial',
+        to: '200px 100px 200px',
+      }, [
+        {at: -1, expect: '-200px -100px -200px'},
         {at: 0, expect: 'none'},
-        {at: 0.125, expect: 'none'},
-        {at: 0.875, expect: 'none'},
+        {at: 0.25, expect: '50px 25px 50px'},
+        {at: 0.75, expect: '150px 75px 150px'},
+        {at: 1, expect: '200px 100px 200px'},
+        {at: 2, expect: '400px 200px 400px'},
+      ]);
+
+      test_interpolation({
+        property: 'translate',
+        from: '200px 100px 400px',
+        to: 'initial',
+      }, [
+        {at: -1, expect: '400px 200px 800px'},
+        {at: 0, expect: '200px 100px 400px'},
+        {at: 0.25, expect: '150px 75px 300px'},
+        {at: 0.75, expect: '50px 25px 100px'},
         {at: 1, expect: 'none'},
-        {at: 2, expect: 'none'}
+        {at: 2, expect: '-200px -100px -400px'},
+      ]);
+
+
+      // Test unset value; for 'translate' this is 'none'.
+      test_interpolation({
+        property: 'translate',
+        from: 'unset',
+        to: '20px',
+      }, [
+        {at: -1, expect: '-20px'},
+        {at: 0, expect: 'none'},
+        {at: 0.25, expect: '5px'},
+        {at: 0.75, expect: '15px'},
+        {at: 1, expect: '20px'},
+        {at: 2, expect: '40px'},
+      ]);
+
+      // Test inherited value.
+      test_interpolation({
+        property: 'translate',
+        from: 'inherit',
+        to: '200px 100px 200px',
+      }, [
+        {at: -1, expect: '0px 300px 400px'},
+        {at: 0, expect: '100px 200px 300px'},
+        {at: 0.25, expect: '125px 175px 275px'},
+        {at: 0.75, expect: '175px 125px 225px'},
+        {at: 1, expect: '200px 100px 200px'},
+        {at: 2, expect: '300px 0px 100px'},
+      ]);
+
+      test_interpolation({
+        property: 'translate',
+        from: '200px 100px 200px',
+        to: 'inherit',
+      }, [
+        {at: -1, expect: '300px 0px 100px'},
+        {at: 0, expect: '200px 100px 200px'},
+        {at: 0.25, expect: '175px 125px 225px'},
+        {at: 0.75, expect: '125px 175px 275px'},
+        {at: 1, expect: '100px 200px 300px'},
+        {at: 2, expect: '0px 300px 400px'},
+      ]);
+
+      // Test combination of initial and inherit.
+      test_interpolation({
+        property: 'translate',
+        from: 'initial',
+        to: 'inherit',
+      }, [
+        {at: -1, expect: '-100px -200px -300px'},
+        {at: 0, expect: 'none'},
+        {at: 0.25, expect: '25px 50px 75px'},
+        {at: 0.75, expect: '75px 150px 225px'},
+        {at: 1, expect: '100px 200px 300px'},
+        {at: 2, expect: '200px 400px 600px'},
+      ]);
+
+      test_interpolation({
+        property: 'translate',
+        from: 'inherit',
+        to: 'initial',
+      }, [
+        {at: -1, expect: '200px 400px 600px'},
+        {at: 0, expect: '100px 200px 300px'},
+        {at: 0.25, expect: '75px 150px 225px'},
+        {at: 0.75, expect: '25px 50px 75px'},
+        {at: 1, expect: 'none'},
+        {at: 2, expect: '-100px -200px -300px'},
       ]);
     </script>
   </body>
diff --git a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-create-basics.html b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-create-basics.html
index 471820b..adfca0b 100644
--- a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-create-basics.html
+++ b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-create-basics.html
@@ -2,7 +2,6 @@
 <title>Credential Manager: create() basics.</title>
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
-<script src="../js-test-resources/document-interface-broker-helpers.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/unguessable_token.mojom-lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/big_buffer.mojom-lite.js"></script>
@@ -12,8 +11,6 @@
 <script src="/gen/url/mojom/url.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/credentialmanager/credential_manager.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/frame/document_interface_broker.mojom-lite.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/mock-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-create-from-nested-frame.html b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-create-from-nested-frame.html
index 9a0d1f2..df0c5a1 100644
--- a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-create-from-nested-frame.html
+++ b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-create-from-nested-frame.html
@@ -4,11 +4,9 @@
 <script src="../resources/testharnessreport.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/time.mojom-lite.js"></script>
-<script src="/gen/mojo/public/mojom/base/unguessable_token.mojom-lite.js"></script>
 <script src="/gen/url/mojom/url.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/authenticator.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/frame/document_interface_broker.mojom-lite.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/virtual-navigator-credentials.js"></script>
 <body>
diff --git a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-create-origins.html b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-create-origins.html
index d2662d28..ec5839d 100644
--- a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-create-origins.html
+++ b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-create-origins.html
@@ -2,7 +2,6 @@
 <title>Credential Manager: create() with custom origins.</title>
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
-<script src="../js-test-resources/document-interface-broker-helpers.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/unguessable_token.mojom-lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/big_buffer.mojom-lite.js"></script>
@@ -12,8 +11,6 @@
 <script src="/gen/url/mojom/url.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/credentialmanager/credential_manager.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/frame/document_interface_broker.mojom-lite.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/mock-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-create-with-virtual-authenticator.html b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-create-with-virtual-authenticator.html
index 8ea1668..c53c45a 100644
--- a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-create-with-virtual-authenticator.html
+++ b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-create-with-virtual-authenticator.html
@@ -5,10 +5,8 @@
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/time.mojom-lite.js"></script>
 <script src="/gen/url/mojom/url.mojom-lite.js"></script>
-<script src="/gen/mojo/public/mojom/base/unguessable_token.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/authenticator.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/frame/document_interface_broker.mojom-lite.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/virtual-navigator-credentials.js"></script>
 <body>
diff --git a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-get-basics.html b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-get-basics.html
index 29a85d3..f3b305d 100644
--- a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-get-basics.html
+++ b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-get-basics.html
@@ -2,7 +2,6 @@
 <title>Credential Manager: get() basics.</title>
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
-<script src="../js-test-resources/document-interface-broker-helpers.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/unguessable_token.mojom-lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/big_buffer.mojom-lite.js"></script>
@@ -12,8 +11,6 @@
 <script src="/gen/url/mojom/url.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/credentialmanager/credential_manager.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/frame/document_interface_broker.mojom-lite.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/mock-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-get-errors.html b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-get-errors.html
index 0eb9d29..63e17a1 100644
--- a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-get-errors.html
+++ b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-get-errors.html
@@ -1,7 +1,6 @@
 <!DOCTYPE html>
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
-<script src="../js-test-resources/document-interface-broker-helpers.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/unguessable_token.mojom-lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/big_buffer.mojom-lite.js"></script>
@@ -11,8 +10,6 @@
 <script src="/gen/url/mojom/url.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/credentialmanager/credential_manager.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/frame/document_interface_broker.mojom-lite.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/mock-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-get-from-nested-frame.html b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-get-from-nested-frame.html
index 6dc61f6..ae66badb 100644
--- a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-get-from-nested-frame.html
+++ b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-get-from-nested-frame.html
@@ -4,11 +4,9 @@
 <script src="../resources/testharnessreport.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/time.mojom-lite.js"></script>
-<script src="/gen/mojo/public/mojom/base/unguessable_token.mojom-lite.js"></script>
 <script src="/gen/url/mojom/url.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/authenticator.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/frame/document_interface_broker.mojom-lite.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/virtual-navigator-credentials.js"></script>
 <body>
diff --git a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-get-origins.html b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-get-origins.html
index 8d509636..bcf63d6 100644
--- a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-get-origins.html
+++ b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-get-origins.html
@@ -2,7 +2,6 @@
 <title>Credential Manager: get() with custom origins.</title>
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
-<script src="../js-test-resources/document-interface-broker-helpers.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/unguessable_token.mojom-lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/big_buffer.mojom-lite.js"></script>
@@ -12,8 +11,6 @@
 <script src="/gen/url/mojom/url.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/credentialmanager/credential_manager.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/frame/document_interface_broker.mojom-lite.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/mock-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-get-with-virtual-authenticator.html b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-get-with-virtual-authenticator.html
index e459331..55e1d38 100644
--- a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-get-with-virtual-authenticator.html
+++ b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-get-with-virtual-authenticator.html
@@ -4,11 +4,9 @@
 <script src="../resources/testharnessreport.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/time.mojom-lite.js"></script>
-<script src="/gen/mojo/public/mojom/base/unguessable_token.mojom-lite.js"></script>
 <script src="/gen/url/mojom/url.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/authenticator.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/frame/document_interface_broker.mojom-lite.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/virtual-navigator-credentials.js"></script>
 <body>
diff --git a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-preventsilentaccess-basics.html b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-preventsilentaccess-basics.html
index 37349d8..1fc603d 100644
--- a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-preventsilentaccess-basics.html
+++ b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-preventsilentaccess-basics.html
@@ -2,7 +2,6 @@
 <title>Credential Manager: preventSilentAccess() basics.</title>
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
-<script src="../js-test-resources/document-interface-broker-helpers.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/unguessable_token.mojom-lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/big_buffer.mojom-lite.js"></script>
@@ -12,8 +11,6 @@
 <script src="/gen/url/mojom/url.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/credentialmanager/credential_manager.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/frame/document_interface_broker.mojom-lite.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/mock-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-store-basics.html b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-store-basics.html
index 4d0c0c2c6..f8ce431b 100644
--- a/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-store-basics.html
+++ b/third_party/blink/web_tests/http/tests/credentialmanager/credentialscontainer-store-basics.html
@@ -2,7 +2,6 @@
 <title>Credential Manager: store() basics.</title>
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
-<script src="../js-test-resources/document-interface-broker-helpers.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/unguessable_token.mojom-lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/big_buffer.mojom-lite.js"></script>
@@ -12,8 +11,6 @@
 <script src="/gen/url/mojom/url.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/credentialmanager/credential_manager.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/frame/document_interface_broker.mojom-lite.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/mock-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/blink/web_tests/http/tests/credentialmanager/mock-authenticator.html b/third_party/blink/web_tests/http/tests/credentialmanager/mock-authenticator.html
index f2db3e7..efc82e4 100644
--- a/third_party/blink/web_tests/http/tests/credentialmanager/mock-authenticator.html
+++ b/third_party/blink/web_tests/http/tests/credentialmanager/mock-authenticator.html
@@ -1,7 +1,6 @@
 <!DOCTYPE html>
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
-<script src="../js-test-resources/document-interface-broker-helpers.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/unguessable_token.mojom-lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/big_buffer.mojom-lite.js"></script>
@@ -11,8 +10,6 @@
 <script src="/gen/url/mojom/url.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/credentialmanager/credential_manager.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/frame/document_interface_broker.mojom-lite.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/mock-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/blink/web_tests/http/tests/credentialmanager/register-then-sign.html b/third_party/blink/web_tests/http/tests/credentialmanager/register-then-sign.html
index d3b64ddb..8abc0e1 100644
--- a/third_party/blink/web_tests/http/tests/credentialmanager/register-then-sign.html
+++ b/third_party/blink/web_tests/http/tests/credentialmanager/register-then-sign.html
@@ -4,11 +4,9 @@
 <script src="../resources/testharnessreport.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/time.mojom-lite.js"></script>
-<script src="/gen/mojo/public/mojom/base/unguessable_token.mojom-lite.js"></script>
 <script src="/gen/url/mojom/url.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/authenticator.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/frame/document_interface_broker.mojom-lite.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/virtual-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/blink/web_tests/http/tests/credentialmanager/resources/mock-navigator-credentials.js b/third_party/blink/web_tests/http/tests/credentialmanager/resources/mock-navigator-credentials.js
index 981900e..0087b59 100644
--- a/third_party/blink/web_tests/http/tests/credentialmanager/resources/mock-navigator-credentials.js
+++ b/third_party/blink/web_tests/http/tests/credentialmanager/resources/mock-navigator-credentials.js
@@ -14,6 +14,13 @@
 class MockCredentialManager {
   constructor() {
     this.reset();
+
+    this.interceptor_ = new MojoInterfaceInterceptor(
+      blink.mojom.CredentialManager.$interfaceName, "context", true);
+    this.interceptor_.oninterfacerequest = e => {
+      this.bindHandleToReceiver(e.handle);
+    };
+    this.interceptor_.start();
   }
 
   bindHandleToReceiver(handle) {
@@ -71,6 +78,13 @@
 class MockAuthenticator {
   constructor() {
     this.reset();
+
+    this.interceptor_ = new MojoInterfaceInterceptor(
+      blink.mojom.Authenticator.$interfaceName, "context", true);
+    this.interceptor_.oninterfacerequest = e => {
+      this.bindHandleToReceiver(e.handle);
+    };
+    this.interceptor_.start();
   }
 
   bindHandleToReceiver(handle) {
@@ -192,12 +206,3 @@
 
 var mockAuthenticator = new MockAuthenticator();
 var mockCredentialManager = new MockCredentialManager();
-
-setDocumentInterfaceBrokerOverrides({
-  getAuthenticator: request => {
-    mockAuthenticator.bindHandleToReceiver(request.handle);
-  },
-  getCredentialManager: request => {
-    mockCredentialManager.bindHandleToReceiver(request.handle);
-  }
-});
diff --git a/third_party/blink/web_tests/http/tests/credentialmanager/resources/publickey-create-helper.html b/third_party/blink/web_tests/http/tests/credentialmanager/resources/publickey-create-helper.html
index 88ce07a..92555d48 100644
--- a/third_party/blink/web_tests/http/tests/credentialmanager/resources/publickey-create-helper.html
+++ b/third_party/blink/web_tests/http/tests/credentialmanager/resources/publickey-create-helper.html
@@ -1,5 +1,4 @@
 <!DOCTYPE HTML>
-<script src="../../js-test-resources/document-interface-broker-helpers.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/unguessable_token.mojom-lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/big_buffer.mojom-lite.js"></script>
@@ -9,7 +8,6 @@
 <script src="/gen/url/mojom/url.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/credentialmanager/credential_manager.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/frame/document_interface_broker.mojom-lite.js"></script>
 <script src="test-inputs.js"></script>
 <script src="mock-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/blink/web_tests/http/tests/credentialmanager/resources/publickey-get-helper.html b/third_party/blink/web_tests/http/tests/credentialmanager/resources/publickey-get-helper.html
index ff6c7699..ed0312abf 100644
--- a/third_party/blink/web_tests/http/tests/credentialmanager/resources/publickey-get-helper.html
+++ b/third_party/blink/web_tests/http/tests/credentialmanager/resources/publickey-get-helper.html
@@ -1,5 +1,4 @@
 <!DOCTYPE HTML>
-<script src="../../js-test-resources/document-interface-broker-helpers.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/unguessable_token.mojom-lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/big_buffer.mojom-lite.js"></script>
@@ -9,7 +8,6 @@
 <script src="/gen/url/mojom/url.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/credentialmanager/credential_manager.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/frame/document_interface_broker.mojom-lite.js"></script>
 <script src="test-inputs.js"></script>
 <script src="mock-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/blink/web_tests/http/tests/credentialmanager/resources/virtual-navigator-credentials.js b/third_party/blink/web_tests/http/tests/credentialmanager/resources/virtual-navigator-credentials.js
index 42bcef4..cc3c84d3 100644
--- a/third_party/blink/web_tests/http/tests/credentialmanager/resources/virtual-navigator-credentials.js
+++ b/third_party/blink/web_tests/http/tests/credentialmanager/resources/virtual-navigator-credentials.js
@@ -53,11 +53,10 @@
 
 class VirtualAuthenticatorManager {
   constructor() {
-    const docBrokerRemote = new blink.mojom.DocumentInterfaceBrokerRemote(
-      Mojo.getDocumentInterfaceBrokerHandle());
     this.virtualAuthenticatorManager_ = new blink.test.mojom.VirtualAuthenticatorManagerRemote;
-    docBrokerRemote.getVirtualAuthenticatorManager(
-      this.virtualAuthenticatorManager_.$.bindNewPipeAndPassReceiver());
+    Mojo.bindInterface(
+      blink.test.mojom.VirtualAuthenticatorManager.$interfaceName,
+      this.virtualAuthenticatorManager_.$.bindNewPipeAndPassReceiver().handle, "context", true);
   }
 
   async createAuthenticator(options = {}) {
diff --git a/third_party/blink/web_tests/http/tests/credentialmanager/virtual-navigator-credentials.html b/third_party/blink/web_tests/http/tests/credentialmanager/virtual-navigator-credentials.html
index 203082b..cf436bc 100644
--- a/third_party/blink/web_tests/http/tests/credentialmanager/virtual-navigator-credentials.html
+++ b/third_party/blink/web_tests/http/tests/credentialmanager/virtual-navigator-credentials.html
@@ -4,11 +4,9 @@
 <script src="../resources/testharnessreport.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js"></script>
 <script src="/gen/mojo/public/mojom/base/time.mojom-lite.js"></script>
-<script src="/gen/mojo/public/mojom/base/unguessable_token.mojom-lite.js"></script>
 <script src="/gen/url/mojom/url.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/authenticator.mojom-lite.js"></script>
 <script src="/gen/third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom-lite.js"></script>
-<script src="/gen/third_party/blink/public/mojom/frame/document_interface_broker.mojom-lite.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/virtual-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/settings/blackbox-a11y-test-expected.txt b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/settings/blackbox-a11y-test-expected.txt
new file mode 100644
index 0000000..679d352
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/settings/blackbox-a11y-test-expected.txt
@@ -0,0 +1,17 @@
+Tests accessibility in Blackboxing view using the axe-core linter.
+
+Running: testAddPattern
+Opened input box: true
+aXe violations: []
+
+
+Running: testPatternList
+Added a pattern in the list: test*
+aXe violations: []
+
+
+Running: testPatternError
+Error message: Pattern cannot be empty
+aXe violations: []
+
+
diff --git a/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/settings/blackbox-a11y-test.js b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/settings/blackbox-a11y-test.js
new file mode 100644
index 0000000..4e6a192
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/devtools/a11y-axe-core/settings/blackbox-a11y-test.js
@@ -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.
+
+(async function() {
+  TestRunner.addResult('Tests accessibility in Blackboxing view using the axe-core linter.');
+
+  await TestRunner.loadModule('axe_core_test_runner');
+  await UI.viewManager.showView('blackbox');
+  const blackboxWidget = await UI.viewManager.view('blackbox').widget();
+
+  async function testAddPattern() {
+    const addPatternButton = blackboxWidget._defaultFocusedElement;
+    // Make add pattern editor visible
+    addPatternButton.click();
+
+    const blackboxInputs = blackboxWidget._list._editor._controls;
+    TestRunner.addResult(`Opened input box: ${!!blackboxInputs}`);
+
+    await AxeCoreTestRunner.runValidation(blackboxWidget.contentElement);
+  }
+
+  async function testPatternList() {
+    blackboxWidget._list.appendItem('test*', true);
+    TestRunner.addResult(`Added a pattern in the list: ${blackboxWidget._list._items}`);
+    await AxeCoreTestRunner.runValidation(blackboxWidget.contentElement);
+  }
+
+  async function testPatternError() {
+    const blackboxEditor = blackboxWidget._list._editor;
+    const patternInput = blackboxEditor._controls[0];
+    // Blur patternInput to run validator
+    patternInput.blur();
+
+    const errorMessage = blackboxEditor._errorMessageContainer.textContent;
+    TestRunner.addResult(`Error message: ${errorMessage}`);
+
+    await AxeCoreTestRunner.runValidation(blackboxWidget.contentElement);
+  }
+
+  TestRunner.runAsyncTestSuite([testAddPattern, testPatternList, testPatternError]);
+})();
\ No newline at end of file
diff --git a/third_party/blink/web_tests/mojo/document-interface-broker-override.html b/third_party/blink/web_tests/mojo/document-interface-broker-override.html
index 3a3e2e8..664f7e6 100644
--- a/third_party/blink/web_tests/mojo/document-interface-broker-override.html
+++ b/third_party/blink/web_tests/mojo/document-interface-broker-override.html
@@ -3,11 +3,8 @@
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js"></script>
-<script src="file:///gen/mojo/public/mojom/base/time.mojom-lite.js"></script>
 <script src="file:///gen/mojo/public/mojom/base/unguessable_token.mojom-lite.js"></script>
 <script src="file:///gen/url/mojom/url.mojom-lite.js"></script>
-<script src="file:///gen/third_party/blink/public/mojom/webauthn/authenticator.mojom-lite.js"></script>
-<script src="file:///gen/third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom-lite.js"></script>
 <script src="file:///gen/third_party/blink/public/mojom/frame/frame_host_test_interface.mojom-lite.js"></script>
 <script src="file:///gen/third_party/blink/public/mojom/frame/document_interface_broker.mojom-lite.js"></script>
 <script>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/scroll-to-child-and-adopt.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/scroll-to-child-and-adopt.html
new file mode 100644
index 0000000..3ffff67
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/scroll-to-child-and-adopt.html
@@ -0,0 +1,35 @@
+<!doctype HTML>
+<html class="reftest-wait">
+<meta charset="utf8">
+<title>Display Locking: scroll child into view, and adopt to a document</title>
+<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
+<link rel="help" href="https://github.com/WICG/display-locking">
+<link rel="match" href="pass-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="resources/utils.js"></script>
+
+<div id=log></div>
+<div id=container>
+    <div id=child></div>
+</div>
+
+<script>
+function finishTest(status_string) {
+  if (document.getElementById("log").innerHTML === "")
+    document.getElementById("log").innerHTML = status_string;
+  takeScreenshot();
+}
+
+function moveChild() {
+  child.scrollIntoView();
+  document.implementation.createDocument( "", null).adoptNode(child);
+  finishTest("PASS");
+}
+
+async function runTest() {
+  await setInvisible(container);
+  requestAnimationFrame(moveChild);
+}
+
+window.onload = requestAnimationFrame(runTest);
+</script>
diff --git a/third_party/closure_compiler/externs/resources_private.js b/third_party/closure_compiler/externs/resources_private.js
index 5da390a7..48314468 100644
--- a/third_party/closure_compiler/externs/resources_private.js
+++ b/third_party/closure_compiler/externs/resources_private.js
@@ -2,15 +2,37 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// This file was generated by:
+//   tools/json_schema_compiler/compiler.py.
+// NOTE: The format of types has changed. 'FooType' is now
+//   'chrome.resourcesPrivate.FooType'.
+// Please run the closure compiler before committing changes.
+// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md
+
+/** @fileoverview Externs generated from namespace: resourcesPrivate */
+
 /**
  * @const
  */
 chrome.resourcesPrivate = {};
 
 /**
- * Records a value than can range from 1 to 1,000,000.
- * @param {string} component
- * @param {!function(Object)} callback Callback to handle the dictionary of
- *     localized strings for |component|.
+ * @enum {string}
+ */
+chrome.resourcesPrivate.Component = {
+  IDENTITY: 'identity',
+  PDF: 'pdf',
+};
+
+/**
+ * Gets localized strings for a component extension. Includes default WebUI
+ * loadTimeData values for text and language settings (fontsize, fontfamily,
+ * language, textdirection). See
+ * chrome/browser/extensions/api/resources_private/resources_private_api.cc for
+ * instructions on adding a new component to this API.
+ * @param {!chrome.resourcesPrivate.Component} component Internal chrome
+ *     component to get strings for.
+ * @param {function(Object):void} callback Called with a dictionary mapping
+ *     names to strings.
  */
 chrome.resourcesPrivate.getStrings = function(component, callback) {};
diff --git a/tools/android/avd/proto/generic_android28.textpb b/tools/android/avd/proto/generic_android28.textpb
index 1792ff1..709deb59 100644
--- a/tools/android/avd/proto/generic_android28.textpb
+++ b/tools/android/avd/proto/generic_android28.textpb
@@ -19,7 +19,7 @@
 
 avd_package {
   package_name: "chromium/third_party/android_sdk/public/avds/android-28/google_apis/x86"
-  version: "J5MFTg7OhekLKsOX7bmkVTSCDzohydCvXrn4sJzy0xsC"
+  version: "r24w7V_DNG3qnGtDROnS4wKxeD1HLyWocCicTBIJqj8C"
   dest_path: ".android"
 }
 avd_name: "20190716T160000Z_android_28_google_apis_x86"
diff --git a/tools/clang/scripts/build.py b/tools/clang/scripts/build.py
index 855aafa..dfba583 100755
--- a/tools/clang/scripts/build.py
+++ b/tools/clang/scripts/build.py
@@ -760,7 +760,7 @@
     cmake_args += ['-DCOMPILER_RT_ENABLE_IOS=ON',
                    '-DSANITIZER_MIN_OSX_VERSION=10.7']
 
-  # TODO(crbug.com/41866): Use -DLLVM_EXTERNAL_PROJECTS instead.
+  # TODO(crbug.com/962988): Use -DLLVM_EXTERNAL_PROJECTS instead.
   CreateChromeToolsShim()
 
   if os.path.exists(LLVM_BUILD_DIR):
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index e977bca..3b3581c 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -17,6 +17,7 @@
       'chromeos-amd64-generic-google-rel': 'official_cros_chrome_sdk',
       'chromeos-betty-google-rel': 'official_cros_chrome_sdk_headless_ozone',
       'chromeos-betty-pi-arc-google-rel': 'official_cros_chrome_sdk_headless_ozone',
+      'chromeos-eve-google-rel': 'official_cros_chrome_sdk_headless_ozone',
       'chromeos-kevin-google-rel': 'official_cros_chrome_sdk_headless_ozone',
       'linux-chromeos-google-rel': 'official_goma_chromeos_minimal_symbols',
       'linux-google-rel': 'official_goma',
@@ -77,6 +78,7 @@
     },
 
     'chromium.android.fyi': {
+      'Android WebView P FYI (rel)': 'android_release_bot_minimal_symbols_arm64_webview_google',
       'Memory Infra Tester': 'android_release_thumb_bot',
       'android-marshmallow-x86-fyi-rel': 'android_release_bot_minimal_symbols_x86_resource_whitelisting',
       'android-pie-x86-fyi-rel': 'android_release_bot_minimal_symbols_x86',
@@ -653,6 +655,7 @@
       'android-marshmallow-x86-fyi-rel': 'android_release_trybot_x86_resource_whitelisting',
       'android-oreo-arm64-cts-networkservice-dbg': 'android_debug_trybot_arm64',
       'android-pie-arm64-rel': 'android_release_trybot_arm64_webview_google',
+      'android-webview-pie-arm64-fyi-rel': 'android_release_trybot_arm64_webview_google',
       'android-pie-x86-fyi-rel': 'android_release_trybot_x86',
       'android_archive_rel_ng': 'android_release_trybot',
       'android_arm64_dbg_recipe': 'android_debug_trybot_compile_only_arm64',
@@ -717,6 +720,7 @@
     'tryserver.chrome': {
       'chromeos-betty-chrome': 'official_cros_chrome_sdk_headless_ozone',
       'chromeos-betty-pi-arc-chrome': 'official_cros_chrome_sdk_headless_ozone',
+      'chromeos-eve-chrome': 'official_cros_chrome_sdk_headless_ozone',
       'chromeos-kevin-chrome': 'official_cros_chrome_sdk_headless_ozone',
       'linux-chrome': 'official_goma',
       'linux-chromeos-chrome': 'official_goma_chromeos_minimal_symbols',
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index dbf4f18b..6ee1f34 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -36629,6 +36629,7 @@
   <int value="288012253" label="CrostiniFiles:enabled"/>
   <int value="288755982"
       label="AutofillEnableLocalCardMigrationForNonSyncUser:enabled"/>
+  <int value="291389947" label="PercentBasedScrolling:disabled"/>
   <int value="291482671" label="ExperimentalFlingAnimation:disabled"/>
   <int value="292560715" label="ViewsCastDialog:disabled"/>
   <int value="293134455" label="AutofillSendBillingCustomerNumber:disabled"/>
@@ -36777,6 +36778,7 @@
   <int value="479906041" label="RunAllFlashInAllowMode:disabled"/>
   <int value="480544447" label="NonValidatingReloadOnRefreshContentV2:enabled"/>
   <int value="481506759" label="ServiceWorkerScriptStreaming:enabled"/>
+  <int value="482232604" label="PercentBasedScrolling:enabled"/>
   <int value="492113129" label="ExperimentalAppBanners:enabled"/>
   <int value="492985975" label="use-monitor-color-space"/>
   <int value="493903641" label="disable-appcontainer"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 18905b5..e4aac0d 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -50588,6 +50588,15 @@
   </summary>
 </histogram>
 
+<histogram name="GPU.GPUChannelHostWaitTime.MicroSeconds" units="microseconds"
+    expires_after="M81">
+  <owner>kylechar@chromium.org</owner>
+  <summary>
+    Records how long the browser UI thread spent blocked for a sync IPC sent
+    using GpuChannelHost to see if it's contributing to jank.
+  </summary>
+</histogram>
+
 <histogram name="GPU.GpuGeneration" enum="GpuSeriesType" expires_after="M90">
   <owner>sunnyps@chromium.org</owner>
   <owner>zmo@chromium.org</owner>
diff --git a/tools/metrics/histograms/review_guidelines.md b/tools/metrics/histograms/review_guidelines.md
index 237443c..18cf756 100644
--- a/tools/metrics/histograms/review_guidelines.md
+++ b/tools/metrics/histograms/review_guidelines.md
@@ -4,7 +4,7 @@
 
 This covers how to review metrics code in the Chromium codebase.
 
-## Reviewing UMA Histograms
+## UMA Histograms
 
 ### What is covered under review?
 
@@ -16,23 +16,23 @@
     (i.e if the histogram name is A.B.C, then A is the histogram namespace).
     If this is a new one, check if there a similar one that already exists?
 
-*   Histogram owners match the [histogram owners guidelines]
-    (https://chromium.googlesource.com/chromium/src/+/HEAD/tools/metrics/histograms/README.md#owners).
+*   Histogram owners match the
+    [histogram owners guidelines](https://chromium.googlesource.com/chromium/src/+/HEAD/tools/metrics/histograms/README.md#owners).
 
 *   If generating multiple histograms programmatically or defining common set of
-    histogram, guide them to use [histogram-suffixes]
-    (https://chromium.googlesource.com/chromium/src/tools/+/refs/heads/master/metrics/histograms/README.md#Histogram-Suffixes).
+    histogram, guide them to use
+    [histogram-suffixes](https://chromium.googlesource.com/chromium/src/tools/+/refs/heads/master/metrics/histograms/README.md#Histogram-Suffixes).
 
 *   Verify that expires_after is reasonable. CL author should be able to justify
-    it. See our guidance at on [histogram-expiry]
-    (https://chromium.googlesource.com/chromium/src/+/HEAD/tools/metrics/histograms/README.md#Histogram-Expiry).
+    it. See guidance at on
+    [histogram-expiry](https://chromium.googlesource.com/chromium/src/+/HEAD/tools/metrics/histograms/README.md#Histogram-Expiry).
 
 *   Summary section should describe what is measured, when is it recorded and
     when not. The summary should generally describe a single emission of sample
     and not the statistics in aggregate.
 
 *   If the histogram is recorded only for some platforms, then it should be
-    included in the summary (Unless part of name).
+    included in the summary (unless part of its name).
 
 *   Histogram and enum names don't include special characters besides dot,
     underscores or slashes.
@@ -48,27 +48,30 @@
 
 *   If modifying an existing histogram, request that the histogram be
     renamed if its meaning has changed significantly. Common practices are to
-    add suffix such as 2 to the name. When doing so the existing entry for the
+    add suffix such as 2 to the name. When doing so, the existing entry for the
     histogram should also be kept but with `<obsolete>` tag.
 
 *   Don't allow deleting histograms or enum buckets unless there is a *very*
     compelling reason to do so (e.g. never logged). Instead they should be
     marked as obsolete with `<obsolete>` tag.
 
-*   Re-naming enum bucket values is not allowed as these break backward
-    compatibility wrt the data stored. When modifying enums it is better to add
-    new values to the enum instead of re-purposing existing enum values.
+*   Re-numbering enum bucket values is not allowed as these break backward
+    compatibility with respect to the data stored.
 
-    *   Modifying labels / summary is safe and allowed without review. However,
-        if reviewing these changes make sure the semantic meaning of the bucket
-        remain unchanged. e.g re-labeling 'Has Error' to 'Has Warning' should
-        not be allowed, while re-labeling 'Has Error' to 'Has Error (e.g this
-        and that error)' is okay.
+*   When modifying enums it is better to add new values to the enum instead of
+    re-purposing existing enum values.
+
+*   Modifying enum labels / summary is safe and allowed without review. However,
+    if reviewing these changes make sure the semantic meaning of the bucket
+    remain unchanged. e.g re-labeling 'Has Error' to 'Has Warning' should not be
+    allowed, while re-labeling 'Has Error' to 'Has Error (e.g this and that
+    error)' is okay.
 
 *   Verify that histogram buckets are not a privacy risk. Some of the types
-    forbidden are if the buckets are encoding page contents, URL or is including
-    any other type of PII or sensitive information. If during review you are
-    unsure then please loop in Chrome Privacy Team in the review.
+    forbidden are if the buckets are encoding page contents, URL, domain name,
+    or is including any other type of personally identifying or sensitive
+    information. If during review you are unsure then do not hesitate to request
+    that Chrome Privacy Team review the change.
 
 *   Check that the histogram bucket space of all possible values for all clients
     will be limited to 50 generally. It should not exceed 100 unless the CL
@@ -90,13 +93,12 @@
     the max. This ensures that even outliers will not overflow the distribution.
 
 *   Verify that for an enum histogram, the enum described in enums.xml and the
-    enum defined in the client code matches. And the enum in the code should
-    have a comment mentioning to keep in-sync with enums.xml.
+    enum defined in the client code matches. Furthermore, the enum in the code
+    should have a comment mentioning that the values must not be changes and aslo that additions to the enum should be synced to enums.xml.
 
-    *   See the sample comment [here]
-        (https://cs.chromium.org/chromium/src/base/metrics/histogram_macros.h?rcl=2c99f35f64380ba63c928787834661fbc1fa4234&l=46)
-        . The comment should be similar.
-
+    *   See the sample comment
+        [here](https://cs.chromium.org/chromium/src/base/metrics/histogram_macros.h?rcl=2c99f35f64380ba63c928787834661fbc1fa4234&l=46).
+        The comment should be identical or nearly so.
 
 *   If the histogram is logged via a macro (rather than a call to the function),
     check that the names will be constant at runtime.
@@ -107,25 +109,26 @@
     recorded and are not reviewing all the corner cases associated with
     collecting the histogram.
 
-*   enums.xml changes don't need our review. But it is still useful to verify
-    that the changes match our guidelines mentioned above.
+*   enums.xml changes don't need a review. However, it is still useful to verify
+    that the changes match the guidelines mentioned above.
 
-### User actions specific
+## User Actions
 
 *   Verify that the user action logged is actually user triggered. If they
-    are not then advise cl author to convert them to a histogram. However if
-    ordering of actions is the interesting part of their analysis then maybe
-    see if each order combination can become a histogram bucket instead of
-    user action.
+    are not then advise cl author to convert them to a histogram.
+
+    *   However if ordering of actions is the interesting part of their analysis
+        then maybe see if each order combination can become a histogram bucket
+        instead of user action.
 
 *   Don't allow logging of noisy user actions (like scroll events). Typical
     allowed frequency is to be less frequent than PageLoad or MobilePageLoaded
     event.
 
-## UKM
+## UKMs
 
-*   UKM metrics are to be reviewed by UKM [data privacy owners]
-(https://cs.chromium.org/chromium/src/tools/metrics/ukm/PRIVACY_OWNERS).
+*   UKM metrics are to be reviewed by UKM
+    [data privacy owners](https://cs.chromium.org/chromium/src/tools/metrics/ukm/PRIVACY_OWNERS).
 
 *   The metrics must follow the
     [data collection guideline](/analysis/uma/g3doc/ukm/ukm.md#adding-ukms).
@@ -134,7 +137,7 @@
 
 ## Other specialized metrics
 
-ChromeUserMetricsExtension proto include variety of other metrics like -
-Omnibox, Profiler, Stability, etc. These are specialized reviews and should
-be routed to relevant owner. The guidelines here don't cover these cases
+The ChromeUserMetricsExtension proto includes a variety of other fields such as
+records for Omnibox, Profiler, Stability, etc. These are specialized reviews and
+should be routed to relevant owner. The guidelines here don't cover these cases
 and typically require a server-side review first to change the proto.
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index 904ed0fc..da510c4 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -300,6 +300,10 @@
 crbug.com/903417 [ win ] system_health.common_desktop/long_running:tools:gmail-foreground [ Skip ]
 crbug.com/911214 [ win ] system_health.common_desktop/multitab:misc:typical24 [ Skip ]
 crbug.com/934270 [ win ] system_health.common_desktop/multitab:misc:typical24:2018 [ Skip ]
+crbug.com/1008093 [ linux ] system_health.common_desktop/multitab:misc:typical24 [ Skip ]
+crbug.com/1008093 [ linux ] system_health.common_desktop/multitab:misc:typical24:2018 [ Skip ]
+crbug.com/1008093 [ mac ] system_health.common_desktop/multitab:misc:typical24 [ Skip ]
+crbug.com/1008093 [ mac ] system_health.common_desktop/multitab:misc:typical24:2018 [ Skip ]
 crbug.com/931185 [ win7 ] system_health.common_desktop/browse:media:youtubetv:2019 [ Skip ]
 crbug.com/958422 [ win7 ] system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
 crbug.com/1008028 [ desktop ] system_health.common_desktop/browse:news:hackernews:2018 [ Skip ]
@@ -332,6 +336,7 @@
 crbug.com/742475 [ mac ] system_health.memory_desktop/multitab:misc:typical24 [ Skip ]
 crbug.com/946495 [ mac ] system_health.memory_desktop/multitab:misc:typical24:2018 [ Skip ]
 crbug.com/838504 [ linux ] system_health.memory_desktop/multitab:misc:typical24 [ Skip ]
+crbug.com/1008093 [ linux ] system_health.memory_desktop/multitab:misc:typical24:2018 [ Skip ]
 crbug.com/773084 [ mac ] system_health.memory_desktop/browse:tools:maps [ Skip ]
 crbug.com/799106 [ win ] system_health.memory_desktop/browse:media:flickr_infinite_scroll [ Skip ]
 crbug.com/836407 [ linux ] system_health.memory_desktop/browse:tools:maps [ Skip ]
@@ -388,6 +393,7 @@
 # Benchmark: tab_switching.typical_25
 crbug.com/747026 [ mac ] tab_switching.typical_25/multitab:misc:typical24 [ Skip ]
 crbug.com/883731 [ win ] tab_switching.typical_25/multitab:misc:typical24 [ Skip ]
+crbug.com/1008093 [ linux ] tab_switching.typical_25/multitab:misc:typical24 [ Skip ]
 
 # Benchmark: tracing.tracing_with_background_memory_infra
 crbug.com/914092 [ win ] tracing.tracing_with_background_memory_infra/http://www.bing.com/ [ Skip ]
diff --git a/ui/accessibility/platform/test_ax_node_wrapper.cc b/ui/accessibility/platform/test_ax_node_wrapper.cc
index 2b289f04..9b692171 100644
--- a/ui/accessibility/platform/test_ax_node_wrapper.cc
+++ b/ui/accessibility/platform/test_ax_node_wrapper.cc
@@ -638,6 +638,9 @@
     case ax::mojom::Role::kHeaderAsNonLandmark:
       return base::ASCIIToUTF16("header");
 
+    case ax::mojom::Role::kMark:
+      return base::ASCIIToUTF16("highlight");
+
     case ax::mojom::Role::kMeter:
       return base::ASCIIToUTF16("meter");
 
diff --git a/ui/android/java/src/org/chromium/ui/base/IdleDetector.java b/ui/android/java/src/org/chromium/ui/base/IdleDetector.java
index 1ab42357..c7c6821 100644
--- a/ui/android/java/src/org/chromium/ui/base/IdleDetector.java
+++ b/ui/android/java/src/org/chromium/ui/base/IdleDetector.java
@@ -46,7 +46,7 @@
     }
 
     @CalledByNative
-    static private IdleDetector create() {
+    private static IdleDetector create() {
         return new IdleDetector();
     }
 
@@ -83,7 +83,6 @@
     private boolean isScreenLocked() {
         Context context = ContextUtils.getApplicationContext();
         KeyguardManager myKM = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
-        return myKM.inKeyguardRestrictedInputMode()
-                || !ApiCompatibilityUtils.isInteractive(context);
+        return myKM.inKeyguardRestrictedInputMode() || !ApiCompatibilityUtils.isInteractive();
     }
 }
diff --git a/ui/base/ui_base_features.cc b/ui/base/ui_base_features.cc
index ae43e08..be0034a 100644
--- a/ui/base/ui_base_features.cc
+++ b/ui/base/ui_base_features.cc
@@ -28,6 +28,11 @@
 const base::Feature kInputMethodSettingsUiUpdate = {
     "InputMethodSettingsUiUpdate", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Enables percent-based scrolling for mousewheel and keyboard initiated
+// scrolls.
+const base::Feature kPercentBasedScrolling = {
+    "PercentBasedScrolling", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Allows requesting unadjusted movement when entering pointerlock.
 const base::Feature kPointerLockOptions = {"PointerLockOptions",
                                            base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ui/base/ui_base_features.h b/ui/base/ui_base_features.h
index e571ffc..eed578b 100644
--- a/ui/base/ui_base_features.h
+++ b/ui/base/ui_base_features.h
@@ -23,6 +23,8 @@
 COMPONENT_EXPORT(UI_BASE_FEATURES)
 extern const base::Feature kInputMethodSettingsUiUpdate;
 COMPONENT_EXPORT(UI_BASE_FEATURES)
+extern const base::Feature kPercentBasedScrolling;
+COMPONENT_EXPORT(UI_BASE_FEATURES)
 extern const base::Feature kPointerLockOptions;
 COMPONENT_EXPORT(UI_BASE_FEATURES)
 extern const base::Feature kSystemCaptionStyle;
diff --git a/ui/display/manager/display_change_observer.cc b/ui/display/manager/display_change_observer.cc
index 33456a71..0b08b11 100644
--- a/ui/display/manager/display_change_observer.cc
+++ b/ui/display/manager/display_change_observer.cc
@@ -298,7 +298,7 @@
 
   new_info.set_panel_orientation(snapshot->panel_orientation());
   new_info.set_sys_path(snapshot->sys_path());
-  new_info.set_native(true);
+  new_info.set_from_native_platform(true);
 
   float device_scale_factor = 1.0f;
   // Sets dpi only if the screen size is not blacklisted.
@@ -309,6 +309,7 @@
   constexpr gfx::Size k225DisplaySizeHack(3000, 2000);
 
   if (snapshot->type() == DISPLAY_CONNECTION_TYPE_INTERNAL) {
+    new_info.set_native(true);
     // TODO(oshima): This is a stopgap hack to deal with b/74845106.
     // Remove this hack when it's resolved.
     if (mode_info->size() == k225DisplaySizeHack)
diff --git a/ui/display/manager/display_manager.cc b/ui/display/manager/display_manager.cc
index 2ecaae6f..4dd630a 100644
--- a/ui/display/manager/display_manager.cc
+++ b/ui/display/manager/display_manager.cc
@@ -2074,7 +2074,9 @@
     }
   } else {
     display_info_[new_info.id()] = new_info;
-    display_info_[new_info.id()].set_native(false);
+    // Set from_native_platform to false so that all information
+    // (rotation, zoom factor etc.) is copied.
+    display_info_[new_info.id()].set_from_native_platform(false);
   }
   display_info_[new_info.id()].UpdateDisplaySize();
 }
diff --git a/ui/display/manager/managed_display_info.cc b/ui/display/manager/managed_display_info.cc
index 8474735..ea1a2465 100644
--- a/ui/display/manager/managed_display_info.cc
+++ b/ui/display/manager/managed_display_info.cc
@@ -288,6 +288,7 @@
       refresh_rate_(60.f),
       is_interlaced_(false),
       is_zoom_factor_from_ui_scale_(false),
+      from_native_platform_(false),
       native_(false),
       is_aspect_preserving_scaling_(false),
       clear_overscan_insets_(false),
@@ -310,6 +311,7 @@
       refresh_rate_(60.f),
       is_interlaced_(false),
       is_zoom_factor_from_ui_scale_(false),
+      from_native_platform_(false),
       native_(false),
       is_aspect_preserving_scaling_(false),
       clear_overscan_insets_(false),
@@ -361,11 +363,12 @@
   bits_per_channel_ = native_info.bits_per_channel_;
   refresh_rate_ = native_info.refresh_rate_;
   is_interlaced_ = native_info.is_interlaced_;
+  native_ = native_info.native_;
 
   // Rotation, color_profile and overscan are given by preference,
   // or unit tests. Don't copy if this native_info came from
   // DisplayChangeObserver.
-  if (native_info.native())
+  if (native_info.from_native_platform())
     return;
   // Update the overscan_insets_in_dip_ either if the inset should be
   // cleared, or has non empty insts.
diff --git a/ui/display/manager/managed_display_info.h b/ui/display/manager/managed_display_info.h
index d0f5e5b2f..a6b795e 100644
--- a/ui/display/manager/managed_display_info.h
+++ b/ui/display/manager/managed_display_info.h
@@ -244,6 +244,11 @@
   void set_native(bool native) { native_ = native; }
   bool native() const { return native_; }
 
+  void set_from_native_platform(bool from_native_platform) {
+    from_native_platform_ = from_native_platform;
+  }
+  bool from_native_platform() const { return from_native_platform_; }
+
   const ManagedDisplayModeList& display_modes() const { return display_modes_; }
   // Sets the display mode list. The mode list will be sorted for the
   // display.
@@ -342,6 +347,9 @@
   bool is_zoom_factor_from_ui_scale_;
 
   // True if this comes from native platform (DisplayChangeObserver).
+  bool from_native_platform_;
+
+  // True if current mode is native mode of the display.
   bool native_;
 
   // True if the display is configured to preserve the aspect ratio. When the
diff --git a/ui/strings/translations/ui_strings_am.xtb b/ui/strings/translations/ui_strings_am.xtb
index acc0b98..270dd55 100644
--- a/ui/strings/translations/ui_strings_am.xtb
+++ b/ui/strings/translations/ui_strings_am.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">የማሳወቂያ ማዕከል፣ <ph name="UNREAD_NOTIFICATION_COUNT" /> ያልተነበቡ ማሳወቂያዎች</translation>
 <translation id="4730374152663651037">በብዛት ጥቅም ላይ የዋለ</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 ወር ቀርቷል}one{# ወሮች ቀርተዋል}other{# ወሮች ቀርተዋል}}</translation>
-<translation id="4841881773802181781">ማስገባት</translation>
 <translation id="4881695831933465202">ክፈት</translation>
 <translation id="4888938634149558681">ጥሪ ያድርጉ</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 ሰከንድ}one{# ሰከንዶች}other{# ሰከንዶች}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">ፋይል አስቀምጥ</translation>
 <translation id="6656912866303152668"><ph name="TARGET_DEVICE_NAME" /> በ Chrome ውስጥ ስምረት እንደበራለት ያረጋግጡ እና በመቀጠል እንደገና ለመላክ ይሞክሩ።</translation>
 <translation id="6699343763173986273">የሚዲያ ቀጣይ ትራክ</translation>
-<translation id="673773751041746814">ስረዛ</translation>
 <translation id="6779314412797872738">አንድ ቁጥር ከዚህ ወደ የእርስዎ Android ስልክ ለመላክ <ph name="TROUBLESHOOT_LINK" /> በቅንብሮች ውስጥ ሁለቱንም መሣሪያዎች ይፈልጋል።</translation>
 <translation id="6786750046913594791">አቃፊ ዝጋ</translation>
 <translation id="6808150112686056157">ሚዲያ አቁም</translation>
diff --git a/ui/strings/translations/ui_strings_ar.xtb b/ui/strings/translations/ui_strings_ar.xtb
index 2eeeff90..3ee209a 100644
--- a/ui/strings/translations/ui_strings_ar.xtb
+++ b/ui/strings/translations/ui_strings_ar.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">مركز الإشعارات، <ph name="UNREAD_NOTIFICATION_COUNT" /> من الإشعارات غير المقروءة</translation>
 <translation id="4730374152663651037">التطبيقات المستخدمة بشكل متكرر</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{يتبقى شهر واحد}zero{يتبقى # شهر}two{يتبقى شهرين (#)}few{يتبقى # أشهر}many{يتبقى # شهرًا}other{يتبقى # شهر}}</translation>
-<translation id="4841881773802181781">إدراج</translation>
 <translation id="4881695831933465202">فتح</translation>
 <translation id="4888938634149558681">إجراء مكالمة</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{ثانية واحدة}zero{# من الثواني}two{ثانيتان (#)}few{# ثوانٍ}many{# ثانية}other{# من الثواني}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">حفظ الملف</translation>
 <translation id="6656912866303152668">‏يُرجى التأكّد من تفعيل إعداد مزامنة الجهاز <ph name="TARGET_DEVICE_NAME" /> في Chrome، ثم محاولة الإرسال مرة أخرى.</translation>
 <translation id="6699343763173986273">المقطع الصوتي التالي للوسائط</translation>
-<translation id="673773751041746814">حذف</translation>
 <translation id="6779314412797872738">‏لإرسال رقم من هنا إلى هاتف Android، يمكنك <ph name="TROUBLESHOOT_LINK" /> لكلا الجهازين في الإعدادات.</translation>
 <translation id="6786750046913594791">إغلاق المجلد</translation>
 <translation id="6808150112686056157">إيقاف الوسائط</translation>
diff --git a/ui/strings/translations/ui_strings_bg.xtb b/ui/strings/translations/ui_strings_bg.xtb
index 4a655e9..1ab070d 100644
--- a/ui/strings/translations/ui_strings_bg.xtb
+++ b/ui/strings/translations/ui_strings_bg.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Център за известия, <ph name="UNREAD_NOTIFICATION_COUNT" /> непрочетени</translation>
 <translation id="4730374152663651037">ЧЕСТО ИЗПОЛЗВАНИ</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{Остава 1 месец}other{Остават # месеца}}</translation>
-<translation id="4841881773802181781">Вмъкване</translation>
 <translation id="4881695831933465202">Отваряне</translation>
 <translation id="4888938634149558681">Обаждане</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 секунда}other{# секунди}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Запазване на файл</translation>
 <translation id="6656912866303152668">Проверете дали синхронизацията в Chrome е включена за <ph name="TARGET_DEVICE_NAME" /> и опитайте да изпратите отново.</translation>
 <translation id="6699343763173986273">Мултимедия, следващият запис</translation>
-<translation id="673773751041746814">Изтриване</translation>
 <translation id="6779314412797872738">За да изпратите номер оттук до телефона си с Android, <ph name="TROUBLESHOOT_LINK" /> в настройките и на двете устройства.</translation>
 <translation id="6786750046913594791">Затваряне на папката</translation>
 <translation id="6808150112686056157">Мултимедия, стоп</translation>
diff --git a/ui/strings/translations/ui_strings_bn.xtb b/ui/strings/translations/ui_strings_bn.xtb
index 0b3bf48..cc2dc3a9 100644
--- a/ui/strings/translations/ui_strings_bn.xtb
+++ b/ui/strings/translations/ui_strings_bn.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">বিজ্ঞপ্তি কেন্দ্র, <ph name="UNREAD_NOTIFICATION_COUNT" />টি না পড়া বিজ্ঞপ্তি</translation>
 <translation id="4730374152663651037">ঘন ঘন ব্যবহার করা হয়</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{১ মাস বাকি}one{# মাস বাকি}other{# মাস বাকি}}</translation>
-<translation id="4841881773802181781">যোগ করা হচ্ছে</translation>
 <translation id="4881695831933465202">খুলুন</translation>
 <translation id="4888938634149558681">কল করুন</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{১ সেকেন্ড}one{# সেকেন্ড}other{# সেকেন্ড}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">ফাইল সেভ করুন</translation>
 <translation id="6656912866303152668"><ph name="TARGET_DEVICE_NAME" /> Chrome-এ সিঙ্ক করার ফিচার চালু করে রেখেছে কিনা দেখে নিন।</translation>
 <translation id="6699343763173986273">মিডিয়া পরবর্তী ট্র্যাক</translation>
-<translation id="673773751041746814">মোছা হচ্ছে</translation>
 <translation id="6779314412797872738">এখান থেকে আপনার Android ফোনে কোনও নম্বর পাঠাতে, সেটিংসে গিয়ে দুটি ডিভাইসের জন্য <ph name="TROUBLESHOOT_LINK" />।</translation>
 <translation id="6786750046913594791">ফোল্ডার বন্ধ করুন</translation>
 <translation id="6808150112686056157">মিডিয়া থামান</translation>
diff --git a/ui/strings/translations/ui_strings_ca.xtb b/ui/strings/translations/ui_strings_ca.xtb
index 8f48c34..8cc83c44 100644
--- a/ui/strings/translations/ui_strings_ca.xtb
+++ b/ui/strings/translations/ui_strings_ca.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Centre de notificacions, <ph name="UNREAD_NOTIFICATION_COUNT" /> notificacions no llegides</translation>
 <translation id="4730374152663651037">UTILITZADES FREQÜENTMENT</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{D'aquí a 1 mes}other{D'aquí a # mesos}}</translation>
-<translation id="4841881773802181781">Inserció</translation>
 <translation id="4881695831933465202">Obre</translation>
 <translation id="4888938634149558681">Fes una trucada</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 segon}other{# segons}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Desa el fitxer</translation>
 <translation id="6656912866303152668">Comprova que <ph name="TARGET_DEVICE_NAME" /> tingui la sincronització activada a Chrome i després prova de tornar a fer l'enviament.</translation>
 <translation id="6699343763173986273">Fitxer multimèdia: pista següent</translation>
-<translation id="673773751041746814">Supressió</translation>
 <translation id="6779314412797872738">Per enviar un número des d'aquest dispositiu al telèfon Android, <ph name="TROUBLESHOOT_LINK" /> a la configuració de tots dos dispositius.</translation>
 <translation id="6786750046913594791">Tanca la carpeta</translation>
 <translation id="6808150112686056157">Fitxer multimèdia: atura</translation>
diff --git a/ui/strings/translations/ui_strings_cs.xtb b/ui/strings/translations/ui_strings_cs.xtb
index 79b0438..7cd5b16 100644
--- a/ui/strings/translations/ui_strings_cs.xtb
+++ b/ui/strings/translations/ui_strings_cs.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Centrum oznámení – nepřečtená oznámení: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation>
 <translation id="4730374152663651037">ČASTO POUŽÍVANÉ</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{zbývá 1 měsíc}few{zbývají # měsíce}many{zbývá # měsíce}other{zbývá # měsíců}}</translation>
-<translation id="4841881773802181781">Vložení</translation>
 <translation id="4881695831933465202">Otevřít</translation>
 <translation id="4888938634149558681">Volat</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekunda}few{# sekundy}many{# sekundy}other{# sekund}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Uložit soubor</translation>
 <translation id="6656912866303152668">Zkontrolujte, zda je v Chromu na zařízení <ph name="TARGET_DEVICE_NAME" /> zapnutá synchronizace, a poté zkuste odeslání opakovat.</translation>
 <translation id="6699343763173986273">Média – další skladba</translation>
-<translation id="673773751041746814">Smazání</translation>
 <translation id="6779314412797872738">Chcete-li si odsud poslat číslo na telefon Android, v nastavení obou zařízení <ph name="TROUBLESHOOT_LINK" />.</translation>
 <translation id="6786750046913594791">Zavřít složku</translation>
 <translation id="6808150112686056157">Média – zastavit</translation>
diff --git a/ui/strings/translations/ui_strings_da.xtb b/ui/strings/translations/ui_strings_da.xtb
index 746405e4..6cb859d 100644
--- a/ui/strings/translations/ui_strings_da.xtb
+++ b/ui/strings/translations/ui_strings_da.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Notifikationscenter, <ph name="UNREAD_NOTIFICATION_COUNT" /> ulæste notifikationer</translation>
 <translation id="4730374152663651037">OFTE ANVENDT</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{Der er 1 måned tilbage}one{Der er # måned tilbage}other{Der er # måneder tilbage}}</translation>
-<translation id="4841881773802181781">Indsættelse</translation>
 <translation id="4881695831933465202">Åbn</translation>
 <translation id="4888938634149558681">Ring op</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekund}one{# sekunder}other{# sekunder}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Gem fil</translation>
 <translation id="6656912866303152668">Sørg for, at synkronisering i Chrome er aktiveret på <ph name="TARGET_DEVICE_NAME" />, og prøv så at sende igen.</translation>
 <translation id="6699343763173986273">Medie: Næste nummer</translation>
-<translation id="673773751041746814">Sletning</translation>
 <translation id="6779314412797872738">Hvis du vil sende et nummer herfra til din Android-telefon, skal du <ph name="TROUBLESHOOT_LINK" /> i indstillingerne på begge enheder.</translation>
 <translation id="6786750046913594791">Luk mappe</translation>
 <translation id="6808150112686056157">Medie: Stop</translation>
diff --git a/ui/strings/translations/ui_strings_de.xtb b/ui/strings/translations/ui_strings_de.xtb
index bb72a05..99cfedb 100644
--- a/ui/strings/translations/ui_strings_de.xtb
+++ b/ui/strings/translations/ui_strings_de.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Benachrichtigungscenter, <ph name="UNREAD_NOTIFICATION_COUNT" /> ungelesene Benachrichtigungen</translation>
 <translation id="4730374152663651037">HÄUFIG VERWENDET</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{noch 1 Monat}other{noch # Monate}}</translation>
-<translation id="4841881773802181781">Einfügen</translation>
 <translation id="4881695831933465202">Öffnen</translation>
 <translation id="4888938634149558681">Anrufen</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 Sekunde}other{# Sekunden}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Datei speichern</translation>
 <translation id="6656912866303152668">Prüfen Sie, ob auf "<ph name="TARGET_DEVICE_NAME" />" die Synchronisierung in Chrome aktiviert ist, und versuchen Sie es dann noch einmal.</translation>
 <translation id="6699343763173986273">Medien – nächster Titel</translation>
-<translation id="673773751041746814">Löschen</translation>
 <translation id="6779314412797872738">Wenn Sie eine Nummer von diesem Gerät an Ihr Android-Smartphone senden möchten, müssen Sie für beide Geräte in den Einstellungen die <ph name="TROUBLESHOOT_LINK" />.</translation>
 <translation id="6786750046913594791">Ordner schließen</translation>
 <translation id="6808150112686056157">Medien – Stopp</translation>
diff --git a/ui/strings/translations/ui_strings_el.xtb b/ui/strings/translations/ui_strings_el.xtb
index 17040cd..48c689984 100644
--- a/ui/strings/translations/ui_strings_el.xtb
+++ b/ui/strings/translations/ui_strings_el.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Κέντρο ειδοποιήσεων, <ph name="UNREAD_NOTIFICATION_COUNT" /> μη αναγνωσμένες ειδοποιήσεις</translation>
 <translation id="4730374152663651037">ΣΥΧΝΗ ΧΡΗΣΗ</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{Απομένει 1 μήνας}other{Απομένουν # μήνες}}</translation>
-<translation id="4841881773802181781">Εισαγωγή</translation>
 <translation id="4881695831933465202">Άνοιγμα</translation>
 <translation id="4888938634149558681">Πραγματοποίηση κλήσης</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 δευτερόλεπτο}other{# δευτερόλεπτα}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Αποθήκευση Αρχείου</translation>
 <translation id="6656912866303152668">Βεβαιωθείτε ότι ο συγχρονισμός στο Chrome έχει ενεργοποιηθεί για τη συσκευή <ph name="TARGET_DEVICE_NAME" /> και έπειτα δοκιμάστε ξανά την αποστολή.</translation>
 <translation id="6699343763173986273">Επόμενο κομμάτι πολυμέσων</translation>
-<translation id="673773751041746814">Διαγραφή</translation>
 <translation id="6779314412797872738">Για να στείλετε έναν αριθμό από εδώ στο τηλέφωνό σας, <ph name="TROUBLESHOOT_LINK" /> και για τις δύο συσκευές στις ρυθμίσεις.</translation>
 <translation id="6786750046913594791">Κλείσιμο φακέλου</translation>
 <translation id="6808150112686056157">Διακοπή πολυμέσων</translation>
diff --git a/ui/strings/translations/ui_strings_en-GB.xtb b/ui/strings/translations/ui_strings_en-GB.xtb
index 86154cbe..6b8f021 100644
--- a/ui/strings/translations/ui_strings_en-GB.xtb
+++ b/ui/strings/translations/ui_strings_en-GB.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Notification Centre, <ph name="UNREAD_NOTIFICATION_COUNT" /> unread notifications</translation>
 <translation id="4730374152663651037">FREQUENTLY USED</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 month left}other{# months left}}</translation>
-<translation id="4841881773802181781">Insertion</translation>
 <translation id="4881695831933465202">Open</translation>
 <translation id="4888938634149558681">Make call</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 second}other{# seconds}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Save File</translation>
 <translation id="6656912866303152668">Make sure that <ph name="TARGET_DEVICE_NAME" /> has sync turned on in Chrome, and then try sending again.</translation>
 <translation id="6699343763173986273">Media Next Track</translation>
-<translation id="673773751041746814">Deletion</translation>
 <translation id="6779314412797872738">To send a number from here to your Android phone, <ph name="TROUBLESHOOT_LINK" /> for both devices in settings.</translation>
 <translation id="6786750046913594791">Close folder</translation>
 <translation id="6808150112686056157">Media Stop</translation>
diff --git a/ui/strings/translations/ui_strings_es-419.xtb b/ui/strings/translations/ui_strings_es-419.xtb
index 29def97..04433be2 100644
--- a/ui/strings/translations/ui_strings_es-419.xtb
+++ b/ui/strings/translations/ui_strings_es-419.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Centro de notificaciones, notificaciones sin leer: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation>
 <translation id="4730374152663651037">USADAS CON FRECUENCIA</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{Queda 1 mes}other{Quedan # meses}}</translation>
-<translation id="4841881773802181781">Contenido agregado</translation>
 <translation id="4881695831933465202">Abrir</translation>
 <translation id="4888938634149558681">Realizar llamada</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 segundo}other{# segundos}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Guardar archivo</translation>
 <translation id="6656912866303152668">Asegúrate de que el dispositivo <ph name="TARGET_DEVICE_NAME" /> tenga activada la sincronización en Chrome y, luego, vuelve a intentar el envío.</translation>
 <translation id="6699343763173986273">Pista multimedia siguiente</translation>
-<translation id="673773751041746814">Contenido borrado</translation>
 <translation id="6779314412797872738">Para enviar un número desde aquí a tu teléfono Android, <ph name="TROUBLESHOOT_LINK" /> en la configuración de ambos dispositivos.</translation>
 <translation id="6786750046913594791">Cerrar carpeta</translation>
 <translation id="6808150112686056157">Detener contenido multimedia</translation>
diff --git a/ui/strings/translations/ui_strings_es.xtb b/ui/strings/translations/ui_strings_es.xtb
index f467d64..fcbf61b 100644
--- a/ui/strings/translations/ui_strings_es.xtb
+++ b/ui/strings/translations/ui_strings_es.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Centro de notificaciones: <ph name="UNREAD_NOTIFICATION_COUNT" /> notificaciones sin leer</translation>
 <translation id="4730374152663651037">UTILIZADAS CON FRECUENCIA</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{Queda 1 mes}other{Quedan # meses}}</translation>
-<translation id="4841881773802181781">Inserción</translation>
 <translation id="4881695831933465202">Abrir</translation>
 <translation id="4888938634149558681">Llamar</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 segundo}other{# segundos}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Guardar archivo</translation>
 <translation id="6656912866303152668">Asegúrate de que la sincronización de <ph name="TARGET_DEVICE_NAME" /> está activada en Chrome y, a continuación, intenta hacer el envío de nuevo.</translation>
 <translation id="6699343763173986273">Siguiente pista multimedia</translation>
-<translation id="673773751041746814">Eliminación</translation>
 <translation id="6779314412797872738">Para enviar un número desde aquí a tu teléfono Android, <ph name="TROUBLESHOOT_LINK" /> en los ajustes de ambos dispositivos.</translation>
 <translation id="6786750046913594791">Cerrar carpeta</translation>
 <translation id="6808150112686056157">Detener contenido multimedia</translation>
diff --git a/ui/strings/translations/ui_strings_et.xtb b/ui/strings/translations/ui_strings_et.xtb
index b6fad25..55ec8e9 100644
--- a/ui/strings/translations/ui_strings_et.xtb
+++ b/ui/strings/translations/ui_strings_et.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Märguandekeskus, <ph name="UNREAD_NOTIFICATION_COUNT" /> lugemata märguannet</translation>
 <translation id="4730374152663651037">SAGELI KASUTATUD</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 kuu jäänud}other{# kuud jäänud}}</translation>
-<translation id="4841881773802181781">Lisamine</translation>
 <translation id="4881695831933465202">Ava</translation>
 <translation id="4888938634149558681">Helista</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekund}other{# sekundit}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Faili salvestamine</translation>
 <translation id="6656912866303152668">Veenduge, et seadmes <ph name="TARGET_DEVICE_NAME" /> oleks Chrome'i sünkroonimine sisse lülitatud, ja proovige siis uuesti saata.</translation>
 <translation id="6699343763173986273">Meediumi järgmine lugu</translation>
-<translation id="673773751041746814">Kustutamine</translation>
 <translation id="6779314412797872738">Selleks et number siit teie Android-telefoni saata, tehke mõlema seadme puhul seadetes järgmist: <ph name="TROUBLESHOOT_LINK" />.</translation>
 <translation id="6786750046913594791">Kausta sulgemine</translation>
 <translation id="6808150112686056157">Meediumi peatamine</translation>
diff --git a/ui/strings/translations/ui_strings_fa.xtb b/ui/strings/translations/ui_strings_fa.xtb
index bdc4561..344fd5a 100644
--- a/ui/strings/translations/ui_strings_fa.xtb
+++ b/ui/strings/translations/ui_strings_fa.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">مرکز اعلان، <ph name="UNREAD_NOTIFICATION_COUNT" /> اعلان خوانده‌نشده</translation>
 <translation id="4730374152663651037">مکرراً استفاده‌شده</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{۱ ماه باقی مانده است}one{# ماه باقی مانده است}other{# ماه باقی مانده است}}</translation>
-<translation id="4841881773802181781">درج</translation>
 <translation id="4881695831933465202">باز کردن</translation>
 <translation id="4888938634149558681">برقراری تماس</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{۱ ثانیه}one{# ثانیه}other{# ثانیه}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">ذخیره کردن فایل</translation>
 <translation id="6656912866303152668">‏مطمئن شوید همگام‌سازی برای <ph name="TARGET_DEVICE_NAME" /> در Chrome روشن باشد و سپس دوباره ارسال کنید.</translation>
 <translation id="6699343763173986273">آهنگ بعدی رسانه</translation>
-<translation id="673773751041746814">حذف</translation>
 <translation id="6779314412797872738">‏برای ارسال شماره‌ای از اینجا به تلفن Android خود، برای هر دو دستگاه در «تنظیمات» <ph name="TROUBLESHOOT_LINK" />.</translation>
 <translation id="6786750046913594791">بستن پوشه</translation>
 <translation id="6808150112686056157">توقف رسانه</translation>
diff --git a/ui/strings/translations/ui_strings_fi.xtb b/ui/strings/translations/ui_strings_fi.xtb
index 0e74e231..85162ff 100644
--- a/ui/strings/translations/ui_strings_fi.xtb
+++ b/ui/strings/translations/ui_strings_fi.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Ilmoituskeskus, <ph name="UNREAD_NOTIFICATION_COUNT" /> lukematonta ilmoitusta</translation>
 <translation id="4730374152663651037">USEIN KÄYTETYT</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 kuukausi jäljellä}other{# kuukautta jäljellä}}</translation>
-<translation id="4841881773802181781">Lisäys</translation>
 <translation id="4881695831933465202">Avaa</translation>
 <translation id="4888938634149558681">Soita</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekunti}other{# sekuntia}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Tallenna tiedosto</translation>
 <translation id="6656912866303152668">Varmista, että <ph name="TARGET_DEVICE_NAME" /> käyttää synkronointia Chromessa, ja yritä lähettämistä sitten uudelleen.</translation>
 <translation id="6699343763173986273">Media: seuraava kappale</translation>
-<translation id="673773751041746814">Poisto</translation>
 <translation id="6779314412797872738">Jos haluat lähettää numeron tältä laitteelta Android-puhelimeesi, <ph name="TROUBLESHOOT_LINK" /> molempien laitteiden asetuksista.</translation>
 <translation id="6786750046913594791">Sulje kansio</translation>
 <translation id="6808150112686056157">Media: pysäytä</translation>
diff --git a/ui/strings/translations/ui_strings_fil.xtb b/ui/strings/translations/ui_strings_fil.xtb
index 67d6cb4..b8bf131 100644
--- a/ui/strings/translations/ui_strings_fil.xtb
+++ b/ui/strings/translations/ui_strings_fil.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Notification Center, <ph name="UNREAD_NOTIFICATION_COUNT" /> (na) hindi pa nababasang notification</translation>
 <translation id="4730374152663651037">MADALAS GAMITIN</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 buwan ang natitira}one{# buwan ang natitira}other{# na buwan ang natitira}}</translation>
-<translation id="4841881773802181781">Paglagay</translation>
 <translation id="4881695831933465202">Buksan</translation>
 <translation id="4888938634149558681">Tumawag</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 segundo}one{# segundo}other{# na segundo}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">I-save ang File</translation>
 <translation id="6656912866303152668">Tiyaking naka-on sa <ph name="TARGET_DEVICE_NAME" /> ang pag-sync sa Chrome, at pagkatapos ay subukang ipadala ulit.</translation>
 <translation id="6699343763173986273">Susunod na Track ng Media</translation>
-<translation id="673773751041746814">Pag-delete</translation>
 <translation id="6779314412797872738">Para magpadala ng numero sa iyong Android phone mula rito, <ph name="TROUBLESHOOT_LINK" /> para sa parehong device sa mga setting.</translation>
 <translation id="6786750046913594791">Isara ang folder</translation>
 <translation id="6808150112686056157">Media Ihinto</translation>
diff --git a/ui/strings/translations/ui_strings_fr.xtb b/ui/strings/translations/ui_strings_fr.xtb
index c609b00..3e26243 100644
--- a/ui/strings/translations/ui_strings_fr.xtb
+++ b/ui/strings/translations/ui_strings_fr.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Centre de notification, <ph name="UNREAD_NOTIFICATION_COUNT" /> notifications non lues</translation>
 <translation id="4730374152663651037">SOUVENT UTILISÉES</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 mois restant}one{# mois restant}other{# mois restants}}</translation>
-<translation id="4841881773802181781">Insertion</translation>
 <translation id="4881695831933465202">Ouvrir</translation>
 <translation id="4888938634149558681">Passer un appel</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 seconde}one{# seconde}other{# secondes}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Enregistrer le fichier</translation>
 <translation id="6656912866303152668">Assurez-vous que la synchronisation est activée dans Chrome sur votre <ph name="TARGET_DEVICE_NAME" />, puis réessayez.</translation>
 <translation id="6699343763173986273">Contenu multimédia : titre suivant</translation>
-<translation id="673773751041746814">Suppression</translation>
 <translation id="6779314412797872738">Pour envoyer un numéro vers votre téléphone Android, veuillez <ph name="TROUBLESHOOT_LINK" /> pour les deux appareils dans les paramètres.</translation>
 <translation id="6786750046913594791">Fermer le dossier</translation>
 <translation id="6808150112686056157">Contenu multimédia : arrêt</translation>
diff --git a/ui/strings/translations/ui_strings_gu.xtb b/ui/strings/translations/ui_strings_gu.xtb
index 87b6f86..9be773d 100644
--- a/ui/strings/translations/ui_strings_gu.xtb
+++ b/ui/strings/translations/ui_strings_gu.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">સૂચના કેન્દ્ર, વાંચ્યા વગરની <ph name="UNREAD_NOTIFICATION_COUNT" /> સૂચનાઓ</translation>
 <translation id="4730374152663651037">વારંવાર વપરાયેલ</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 મહિનો બાકી}one{# મહિનો બાકી}other{# મહિના બાકી}}</translation>
-<translation id="4841881773802181781">ઉમેરો</translation>
 <translation id="4881695831933465202">ખોલો</translation>
 <translation id="4888938634149558681">કૉલ કરો</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 સેકન્ડ}one{# સેકન્ડ}other{# સેકન્ડ}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">ફાઇલ સાચવો</translation>
 <translation id="6656912866303152668"><ph name="TARGET_DEVICE_NAME" />એ Chromeમાં સિંક ચાલુ કર્યું હોય તેની ખાતરી કરો અને પછી ફરી મોકલી જુઓ.</translation>
 <translation id="6699343763173986273">મીડિયા આગલો ટ્રૅક</translation>
-<translation id="673773751041746814">ડિલીટ કરો</translation>
 <translation id="6779314412797872738">અહીંથી તમારા Android ફોન પર નંબર મોકલવા માટે, સેટિંગમાં બંને ડિવાઇસ માટે <ph name="TROUBLESHOOT_LINK" />.</translation>
 <translation id="6786750046913594791">ફોલ્ડર બંધ કરો</translation>
 <translation id="6808150112686056157">મીડિયા સ્ટોપ</translation>
diff --git a/ui/strings/translations/ui_strings_hi.xtb b/ui/strings/translations/ui_strings_hi.xtb
index a5f1f0c1..0402655 100644
--- a/ui/strings/translations/ui_strings_hi.xtb
+++ b/ui/strings/translations/ui_strings_hi.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">सूचना केंद्र, <ph name="UNREAD_NOTIFICATION_COUNT" /> नहीं पढ़ी गई सूचनाएं</translation>
 <translation id="4730374152663651037">अक्सर उपयोग किए गए</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 माह शेष}one{# माह शेष}other{# माह शेष}}</translation>
-<translation id="4841881773802181781">डालना</translation>
 <translation id="4881695831933465202">खोलें</translation>
 <translation id="4888938634149558681">कॉल करें</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 सेकंड}one{# सेकंड}other{# सेकंड}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">फ़ाइल सेव करें</translation>
 <translation id="6656912866303152668">पक्का करें कि Chrome में <ph name="TARGET_DEVICE_NAME" /> सिंक करने की सुविधा चालू है. इसके बाद, फिर से भेजने की कोशिश करें.</translation>
 <translation id="6699343763173986273">मीडिया अगला ट्रैक</translation>
-<translation id="673773751041746814">मिटाना</translation>
 <translation id="6779314412797872738">यहां से अपने फ़ोन पर नंबर भेजने के लिए, सेटिंग में जाकर दोनों डिवाइस के लिए <ph name="TROUBLESHOOT_LINK" /> इस्तेमाल करें.</translation>
 <translation id="6786750046913594791">फ़ोल्डर बंद करें</translation>
 <translation id="6808150112686056157">मीडिया रोकें</translation>
diff --git a/ui/strings/translations/ui_strings_hr.xtb b/ui/strings/translations/ui_strings_hr.xtb
index 59528f58..003925f 100644
--- a/ui/strings/translations/ui_strings_hr.xtb
+++ b/ui/strings/translations/ui_strings_hr.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Centar za obavijesti, nepročitanih obavijesti: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation>
 <translation id="4730374152663651037">ČESTO KORIŠTENO</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{Još mjesec dana}one{Još # mjesec}few{Još # mjeseca}other{Još # mjeseci}}</translation>
-<translation id="4841881773802181781">Umetanje</translation>
 <translation id="4881695831933465202">Otvori</translation>
 <translation id="4888938634149558681">Uputi poziv</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekunda}one{# sekunda}few{# sekunde}other{# sekundi}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Spremi datoteku</translation>
 <translation id="6656912866303152668">Provjerite je li za <ph name="TARGET_DEVICE_NAME" /> uključena sinkronizacija u Chromeu, a potom pokušajte ponovo poslati.</translation>
 <translation id="6699343763173986273">Sljedeći zapis Medija</translation>
-<translation id="673773751041746814">Brisanje</translation>
 <translation id="6779314412797872738">Da biste poslali broj s ovog uređaja na svoj Android telefon, <ph name="TROUBLESHOOT_LINK" /> za oba uređaja u postavkama.</translation>
 <translation id="6786750046913594791">Zatvori mapu</translation>
 <translation id="6808150112686056157">Zaustavi Medije</translation>
diff --git a/ui/strings/translations/ui_strings_hu.xtb b/ui/strings/translations/ui_strings_hu.xtb
index ab181ad..a091db0 100644
--- a/ui/strings/translations/ui_strings_hu.xtb
+++ b/ui/strings/translations/ui_strings_hu.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Értesítési központ, <ph name="UNREAD_NOTIFICATION_COUNT" /> olvasatlan értesítés</translation>
 <translation id="4730374152663651037">GYAKRAN HASZNÁLT</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{hátralévő idő: 1 hónap}other{hátralévő idő: # hónap}}</translation>
-<translation id="4841881773802181781">Beszúrás</translation>
 <translation id="4881695831933465202">Megnyitás</translation>
 <translation id="4888938634149558681">Hívás indítása</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 másodperc}other{# másodperc}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Fájl mentése</translation>
 <translation id="6656912866303152668">Győződjön meg arról, hogy a(z) <ph name="TARGET_DEVICE_NAME" /> szinkronizálása be van kapcsolva a Chrome-ban, majd próbálja újra.</translation>
 <translation id="6699343763173986273">Következő szám</translation>
-<translation id="673773751041746814">Törlés</translation>
 <translation id="6779314412797872738">Ha innen szeretne számot küldeni Android-telefonjára, <ph name="TROUBLESHOOT_LINK" /> a beállításokban mindkét eszközén.</translation>
 <translation id="6786750046913594791">Mappa bezárása</translation>
 <translation id="6808150112686056157">Leállítás</translation>
diff --git a/ui/strings/translations/ui_strings_id.xtb b/ui/strings/translations/ui_strings_id.xtb
index 2a1dc934..a5f1f4d6 100644
--- a/ui/strings/translations/ui_strings_id.xtb
+++ b/ui/strings/translations/ui_strings_id.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Pusat Notifikasi, <ph name="UNREAD_NOTIFICATION_COUNT" /> notifikasi belum dibaca</translation>
 <translation id="4730374152663651037">SERING DIGUNAKAN</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 bulan lagi}other{# bulan lagi}}</translation>
-<translation id="4841881773802181781">Penyisipan</translation>
 <translation id="4881695831933465202">Buka</translation>
 <translation id="4888938634149558681">Telepon</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 detik}other{# detik}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Simpan File</translation>
 <translation id="6656912866303152668">Pastikan <ph name="TARGET_DEVICE_NAME" /> telah mengaktifkan sinkronisasi di Chrome, dan coba kirim lagi.</translation>
 <translation id="6699343763173986273">Lacak Media Berikutnya</translation>
-<translation id="673773751041746814">Penghapusan</translation>
 <translation id="6779314412797872738">Untuk mengirim nomor dari sini ke ponsel Android Anda, <ph name="TROUBLESHOOT_LINK" /> untuk kedua perangkat di setelan.</translation>
 <translation id="6786750046913594791">Tutup folder</translation>
 <translation id="6808150112686056157">Hentikan Media</translation>
diff --git a/ui/strings/translations/ui_strings_it.xtb b/ui/strings/translations/ui_strings_it.xtb
index 3d311e91..6e7a8e4 100644
--- a/ui/strings/translations/ui_strings_it.xtb
+++ b/ui/strings/translations/ui_strings_it.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Centro notifiche, <ph name="UNREAD_NOTIFICATION_COUNT" /> notifiche da leggere</translation>
 <translation id="4730374152663651037">USATE SPESSO</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 mese rimasto}other{# mesi rimasti}}</translation>
-<translation id="4841881773802181781">Inserimento</translation>
 <translation id="4881695831933465202">Apri</translation>
 <translation id="4888938634149558681">Chiama</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 secondo}other{# secondi}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Salva file</translation>
 <translation id="6656912866303152668">Assicurati che in Chrome sia attiva la sincronizzazione di <ph name="TARGET_DEVICE_NAME" />, quindi riprova a inviare.</translation>
 <translation id="6699343763173986273">Traccia successiva contenuti multimediali</translation>
-<translation id="673773751041746814">Eliminazione</translation>
 <translation id="6779314412797872738">Per inviare un numero da qui al tuo telefono Android, <ph name="TROUBLESHOOT_LINK" /> per entrambi i dispositivi nelle impostazioni.</translation>
 <translation id="6786750046913594791">Chiudi cartella</translation>
 <translation id="6808150112686056157">Interrompi contenuti multimediali</translation>
diff --git a/ui/strings/translations/ui_strings_iw.xtb b/ui/strings/translations/ui_strings_iw.xtb
index 27a554bd..15f26d17 100644
--- a/ui/strings/translations/ui_strings_iw.xtb
+++ b/ui/strings/translations/ui_strings_iw.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">מרכז הודעות, <ph name="UNREAD_NOTIFICATION_COUNT" /> הודעות שלא נקראו</translation>
 <translation id="4730374152663651037">בשימוש לעתים קרובות</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{נותר חודש אחד}two{נותרו חודשיים}many{נותרו # חודשים}other{נותרו # חודשים}}</translation>
-<translation id="4841881773802181781">הוספה</translation>
 <translation id="4881695831933465202">פתיחה</translation>
 <translation id="4888938634149558681">התקשרות</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{שנייה אחת}two{# שניות}many{# שניות}other{# שניות}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">שמור קובץ</translation>
 <translation id="6656912866303152668">‏יש לוודא שהסנכרון עם <ph name="TARGET_DEVICE_NAME" /> הופעל ב-Chrome, ולאחר מכן לנסות את השליחה שוב.</translation>
 <translation id="6699343763173986273">הרצועה הבאה במדיה</translation>
-<translation id="673773751041746814">מחיקה</translation>
 <translation id="6779314412797872738">‏כדי לשלוח מכאן מספר לטלפון ה-Android שלך, יש <ph name="TROUBLESHOOT_LINK" /> בהגדרות של שני המכשירים.</translation>
 <translation id="6786750046913594791">סגור את התיקייה</translation>
 <translation id="6808150112686056157">עצור מדיה</translation>
diff --git a/ui/strings/translations/ui_strings_ja.xtb b/ui/strings/translations/ui_strings_ja.xtb
index 2efe073b..0d46877e 100644
--- a/ui/strings/translations/ui_strings_ja.xtb
+++ b/ui/strings/translations/ui_strings_ja.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">通知センター: <ph name="UNREAD_NOTIFICATION_COUNT" /> 件の未読通知</translation>
 <translation id="4730374152663651037">よく使用するアプリ</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{残り 1 か月}other{残り # か月}}</translation>
-<translation id="4841881773802181781">挿入</translation>
 <translation id="4881695831933465202">開く</translation>
 <translation id="4888938634149558681">電話をかける</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 秒}other{# 秒}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">ファイルを保存</translation>
 <translation id="6656912866303152668"><ph name="TARGET_DEVICE_NAME" /> の Chrome で同期がオンになっていることを確認してから、もう一度送信してください。</translation>
 <translation id="6699343763173986273">メディアの次のトラック</translation>
-<translation id="673773751041746814">削除</translation>
 <translation id="6779314412797872738">Android スマートフォンに番号を送信するには、設定で両方のデバイスの<ph name="TROUBLESHOOT_LINK" />にしてください。</translation>
 <translation id="6786750046913594791">フォルダを閉じる</translation>
 <translation id="6808150112686056157">メディアの停止</translation>
diff --git a/ui/strings/translations/ui_strings_kn.xtb b/ui/strings/translations/ui_strings_kn.xtb
index 4ca05275..f046e218 100644
--- a/ui/strings/translations/ui_strings_kn.xtb
+++ b/ui/strings/translations/ui_strings_kn.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">ಅಧಿಸೂಚನೆ ಕೇಂದ್ರ, <ph name="UNREAD_NOTIFICATION_COUNT" /> ಓದದಿರುವ ಅಧಿಸೂಚನೆಗಳು</translation>
 <translation id="4730374152663651037">ಪದೇ ಪದೇ ಬಳಸಿರುವುದು</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 ತಿಂಗಳು ಉಳಿದಿದೆ}one{# ತಿಂಗಳುಗಳು ಉಳಿದಿವೆ}other{# ತಿಂಗಳುಗಳು ಉಳಿದಿವೆ}}</translation>
-<translation id="4841881773802181781">ಅಳವಡಿಕೆ</translation>
 <translation id="4881695831933465202">ತೆರೆ</translation>
 <translation id="4888938634149558681">ಕರೆ ಮಾಡಿ</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 ಸೆಕೆಂಡ್}one{# ಸೆಕೆಂಡುಗಳು}other{# ಸೆಕೆಂಡುಗಳು}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">ಫೈಲ್ ಉಳಿಸು</translation>
 <translation id="6656912866303152668">Chrome ನಲ್ಲಿ <ph name="TARGET_DEVICE_NAME" /> ಸಾಧನದ ಸಿಂಕ್ ಆನ್ ಆಗಿದೆಯೇ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ, ತದನಂತರ ಮತ್ತೆ ಕಳುಹಿಸಲು ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="6699343763173986273">ಮೀಡಿಯಾದ ಮುಂದಿನ ಟ್ರ್ಯಾಕ್</translation>
-<translation id="673773751041746814">ಅಳಿಸುವಿಕೆ</translation>
 <translation id="6779314412797872738">ಇಲ್ಲಿಂದ ನಿಮ್ಮ Android ಫೋನ್‌ಗೆ ಒಂದು ಸಂಖ್ಯೆಯನ್ನು ಕಳುಹಿಸಲು, ಎರಡೂ ಸಾಧನಗಳಿಗಾಗಿ, ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ <ph name="TROUBLESHOOT_LINK" />.</translation>
 <translation id="6786750046913594791">ಫೋಲ್ಡರ್ ಮುಚ್ಚಿರಿ</translation>
 <translation id="6808150112686056157">ಮೀಡಿಯಾ ನಿಲುಗಡೆ</translation>
diff --git a/ui/strings/translations/ui_strings_ko.xtb b/ui/strings/translations/ui_strings_ko.xtb
index 90c67b5..6020ee0 100644
--- a/ui/strings/translations/ui_strings_ko.xtb
+++ b/ui/strings/translations/ui_strings_ko.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">알림 센터, 읽지 않은 알림 <ph name="UNREAD_NOTIFICATION_COUNT" />개</translation>
 <translation id="4730374152663651037">자주 사용하는 앱</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{1개월 남음}other{#개월 남음}}</translation>
-<translation id="4841881773802181781">삽입</translation>
 <translation id="4881695831933465202">열기</translation>
 <translation id="4888938634149558681">전화 걸기</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1초}other{#초}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">파일 저장</translation>
 <translation id="6656912866303152668"><ph name="TARGET_DEVICE_NAME" />에서 Chrome 동기화가 사용 설정되어 있는지 확인한 다음 다시 보내 보세요.</translation>
 <translation id="6699343763173986273">미디어 다음 트랙</translation>
-<translation id="673773751041746814">삭제</translation>
 <translation id="6779314412797872738">여기에서 Android 휴대전화로 번호를 전송하려면 두 기기 모두 설정에서 <ph name="TROUBLESHOOT_LINK" />하세요.</translation>
 <translation id="6786750046913594791">폴더 닫기</translation>
 <translation id="6808150112686056157">미디어 중지</translation>
diff --git a/ui/strings/translations/ui_strings_lt.xtb b/ui/strings/translations/ui_strings_lt.xtb
index 8344ae2..1f1266a 100644
--- a/ui/strings/translations/ui_strings_lt.xtb
+++ b/ui/strings/translations/ui_strings_lt.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Pranešimų centras, neskaitytų pranešimų: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation>
 <translation id="4730374152663651037">DAŽNAI NAUDOJAMOS PROGRAMOS</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{Liko 1 mėnuo}one{Liko # mėnuo}few{Liko # mėnesiai}many{Liko # mėnesio}other{Liko # mėnesių}}</translation>
-<translation id="4841881773802181781">Įterpimas</translation>
 <translation id="4881695831933465202">Atidaryti</translation>
 <translation id="4888938634149558681">Skambinti</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekundė}one{# sekundė}few{# sekundės}many{# sekundės}other{# sekundžių}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Išsaugoti failą</translation>
 <translation id="6656912866303152668">Įsitikinkite, kad įrenginio „<ph name="TARGET_DEVICE_NAME" />“ naršyklėje „Chrome“ įjungtas sinchronizavimas, tada bandykite siųsti dar kartą.</translation>
 <translation id="6699343763173986273">Kitas medijos takelis</translation>
-<translation id="673773751041746814">Trynimas</translation>
 <translation id="6779314412797872738">Jei norite iš čia į „Android“ telefoną išsiųsti numerį, nustatymuose<ph name="TROUBLESHOOT_LINK" /> abiejuose įrenginiuose.</translation>
 <translation id="6786750046913594791">Uždaryti aplanką</translation>
 <translation id="6808150112686056157">Sustabdyti mediją</translation>
diff --git a/ui/strings/translations/ui_strings_lv.xtb b/ui/strings/translations/ui_strings_lv.xtb
index d57896d..6e382549 100644
--- a/ui/strings/translations/ui_strings_lv.xtb
+++ b/ui/strings/translations/ui_strings_lv.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Paziņojumu centrs, <ph name="UNREAD_NOTIFICATION_COUNT" /> nelasīts(-i) paziņojums(-i)</translation>
 <translation id="4730374152663651037">BIEŽI IZMANTOTĀS</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{Atlicis 1 mēnesis}zero{Atlikuši # mēneši}one{Atlicis # mēnesis}other{Atlikuši # mēneši}}</translation>
-<translation id="4841881773802181781">Ievietošana</translation>
 <translation id="4881695831933465202">Atvērt</translation>
 <translation id="4888938634149558681">Zvanīt</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekunde}zero{# sekundes}one{# sekunde}other{# sekundes}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Saglabāt failu</translation>
 <translation id="6656912866303152668">Gādājiet, lai ierīces <ph name="TARGET_DEVICE_NAME" /> pārlūkprogrammā Chrome ir ieslēgta sinhronizācija, un pēc tam mēģiniet nosūtīt saturu vēlreiz.</translation>
 <translation id="6699343763173986273">Multivide — nākamā dziesma</translation>
-<translation id="673773751041746814">Dzēšana</translation>
 <translation id="6779314412797872738">Lai no šejienes uz Android tālruni nosūtītu numuru, <ph name="TROUBLESHOOT_LINK" /> abām iestatījumos esošajām ierīcēm.</translation>
 <translation id="6786750046913594791">Aizvērt mapi</translation>
 <translation id="6808150112686056157">Multivide — pārtraukt</translation>
diff --git a/ui/strings/translations/ui_strings_ml.xtb b/ui/strings/translations/ui_strings_ml.xtb
index 0b7c8eb..cf513c7 100644
--- a/ui/strings/translations/ui_strings_ml.xtb
+++ b/ui/strings/translations/ui_strings_ml.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">അറിയിപ്പ് കേന്ദ്രം, <ph name="UNREAD_NOTIFICATION_COUNT" /> വായിക്കാത്ത അറിയിപ്പുകൾ</translation>
 <translation id="4730374152663651037">പതിവായി ഉപയോഗിക്കുന്നത്</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{ഒരു മാസം ശേഷിക്കുന്നു}other{# മാസം ശേഷിക്കുന്നു}}</translation>
-<translation id="4841881773802181781">ചേർക്കൽ</translation>
 <translation id="4881695831933465202">തുറക്കുക</translation>
 <translation id="4888938634149558681">കോൾ ചെയ്യുക</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{ഒരു സെക്കന്‍ഡ്}other{# സെക്കൻഡ്}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">ഫയല്‍‌ സംരക്ഷിക്കുക</translation>
 <translation id="6656912866303152668">Chrome-ൽ <ph name="TARGET_DEVICE_NAME" /> എന്ന ഉപകരണത്തിൽ സമന്വയം ഓണാക്കിയിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക, തുടർന്ന് വീണ്ടും അയയ്ക്കാൻ ശ്രമിക്കുക.</translation>
 <translation id="6699343763173986273">അടുത്ത മീഡിയ ട്രാക്ക്</translation>
-<translation id="673773751041746814">ഇല്ലാതാക്കൽ</translation>
 <translation id="6779314412797872738">നിങ്ങളുടെ Android ഫോണിലേക്ക് ഇവിടെ നിന്ന് ഒരു നമ്പർ അയയ്‌ക്കാൻ, ക്രമീകരണത്തിൽ രണ്ട് ഉപകരണങ്ങളുടെയും <ph name="TROUBLESHOOT_LINK" />.</translation>
 <translation id="6786750046913594791">ഫോൾഡർ അടയ്ക്കുക</translation>
 <translation id="6808150112686056157">മീഡിയ ‌നിർത്തുക</translation>
diff --git a/ui/strings/translations/ui_strings_mr.xtb b/ui/strings/translations/ui_strings_mr.xtb
index c7a7c8a..da838ea6 100644
--- a/ui/strings/translations/ui_strings_mr.xtb
+++ b/ui/strings/translations/ui_strings_mr.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">सूचना केंद्र, <ph name="UNREAD_NOTIFICATION_COUNT" /> न वाचलेल्या सूचना</translation>
 <translation id="4730374152663651037">वारंवार वापरलेले</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 महिना राहिला}other{# महिने राहिले}}</translation>
-<translation id="4841881773802181781">घालणे</translation>
 <translation id="4881695831933465202">उघडा</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 सेकंद}other{# सेकंद}}</translation>
 <translation id="4971687151119236543">मीडिया मागील ट्रॅक</translation>
@@ -164,7 +163,6 @@
 <translation id="6620110761915583480">फाइल सेव्ह करा</translation>
 <translation id="6656912866303152668">Chrome मध्ये <ph name="TARGET_DEVICE_NAME" /> चे सिंक सुरू केले असल्याची खात्री करा आणि त्यानंतर पाठवण्याचा पुन्हा प्रयत्न करा.</translation>
 <translation id="6699343763173986273">मीडिया पुढील ट्रॅक</translation>
-<translation id="673773751041746814">हटवणे</translation>
 <translation id="6779314412797872738">येथून तुमच्या Android फोनवर नंबर पाठवण्यासाठी, सेटिंग्जमध्ये दोन्ही डिव्हाइससाठी <ph name="TROUBLESHOOT_LINK" />.</translation>
 <translation id="6786750046913594791">फोल्डर बंद करा</translation>
 <translation id="6808150112686056157">मीडिया थांबवा</translation>
diff --git a/ui/strings/translations/ui_strings_ms.xtb b/ui/strings/translations/ui_strings_ms.xtb
index c5181725..e353da6b 100644
--- a/ui/strings/translations/ui_strings_ms.xtb
+++ b/ui/strings/translations/ui_strings_ms.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Pusat Pemberitahuan, <ph name="UNREAD_NOTIFICATION_COUNT" /> pemberitahuan belum dibaca</translation>
 <translation id="4730374152663651037">KERAP DIGUNAKAN</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{Berbaki 1 bulan}other{Berbaki # bulan}}</translation>
-<translation id="4841881773802181781">Penyisipan</translation>
 <translation id="4881695831933465202">Buka</translation>
 <translation id="4888938634149558681">Buat panggilan</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 saat}other{# saat}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Simpan Fail</translation>
 <translation id="6656912866303152668">Pastikan penyegerakan <ph name="TARGET_DEVICE_NAME" /> telah dihidupkan dalam Chrome, kemudian cuba hantar lagi.</translation>
 <translation id="6699343763173986273">Lagu Media Seterusnya</translation>
-<translation id="673773751041746814">Pemadaman</translation>
 <translation id="6779314412797872738">Untuk menghantar nombor dari sini ke telefon Android anda, <ph name="TROUBLESHOOT_LINK" /> untuk kedua-dua peranti dalam tetapan.</translation>
 <translation id="6786750046913594791">Tutup folder</translation>
 <translation id="6808150112686056157">Media Berhenti</translation>
diff --git a/ui/strings/translations/ui_strings_nl.xtb b/ui/strings/translations/ui_strings_nl.xtb
index 4d8e9cc6..3e9fc05 100644
--- a/ui/strings/translations/ui_strings_nl.xtb
+++ b/ui/strings/translations/ui_strings_nl.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Meldingscentrum, <ph name="UNREAD_NOTIFICATION_COUNT" /> ongelezen meldingen</translation>
 <translation id="4730374152663651037">VEELGEBRUIKT</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{Nog 1 maand}other{Nog # maanden}}</translation>
-<translation id="4841881773802181781">Invoeging</translation>
 <translation id="4881695831933465202">Openen</translation>
 <translation id="4888938634149558681">Bellen</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 seconde}other{# seconden}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Bestand opslaan</translation>
 <translation id="6656912866303152668">Zorg dat synchronisatie in Chrome is ingeschakeld voor <ph name="TARGET_DEVICE_NAME" /> en probeer opnieuw te verzenden.</translation>
 <translation id="6699343763173986273">Volgende track voor media</translation>
-<translation id="673773751041746814">Verwijdering</translation>
 <translation id="6779314412797872738">Als je vanaf hier een nummer naar je Android-telefoon wilt sturen, moet je in de instellingen <ph name="TROUBLESHOOT_LINK" /> voor beide apparaten.</translation>
 <translation id="6786750046913594791">Map sluiten</translation>
 <translation id="6808150112686056157">Media stoppen</translation>
diff --git a/ui/strings/translations/ui_strings_no.xtb b/ui/strings/translations/ui_strings_no.xtb
index 7f57b9d..222c6ed 100644
--- a/ui/strings/translations/ui_strings_no.xtb
+++ b/ui/strings/translations/ui_strings_no.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Varselsenter, <ph name="UNREAD_NOTIFICATION_COUNT" /> uleste varsler</translation>
 <translation id="4730374152663651037">OFTE BRUKT</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 måned igjen}other{# måneder igjen}}</translation>
-<translation id="4841881773802181781">Innsetting</translation>
 <translation id="4881695831933465202">Åpne</translation>
 <translation id="4888938634149558681">Ring</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekund}other{# sekunder}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Lagre fil</translation>
 <translation id="6656912866303152668">Kontrollér at <ph name="TARGET_DEVICE_NAME" /> har synkronisering påslått i Chrome, og prøv deretter å sende på nytt.</translation>
 <translation id="6699343763173986273">Media – neste spor</translation>
-<translation id="673773751041746814">Sletting</translation>
 <translation id="6779314412797872738">For å sende numre herfra til Android-telefonen din, <ph name="TROUBLESHOOT_LINK" /> for begge enhetene i innstillingene.</translation>
 <translation id="6786750046913594791">Lukk mappen</translation>
 <translation id="6808150112686056157">Media – stopp</translation>
diff --git a/ui/strings/translations/ui_strings_pl.xtb b/ui/strings/translations/ui_strings_pl.xtb
index 7f98855e..d83f57cf 100644
--- a/ui/strings/translations/ui_strings_pl.xtb
+++ b/ui/strings/translations/ui_strings_pl.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Centrum powiadomień, liczba nieprzeczytanych powiadomień: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation>
 <translation id="4730374152663651037">CZĘSTO UŻYWANE</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{Pozostał miesiąc}few{Pozostały # miesiące}many{Pozostało # miesięcy}other{Pozostało # miesiąca}}</translation>
-<translation id="4841881773802181781">Wstawienie</translation>
 <translation id="4881695831933465202">Otwórz</translation>
 <translation id="4888938634149558681">Zadzwoń</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekunda}few{# sekundy}many{# sekund}other{# sekundy}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Zapisz plik</translation>
 <translation id="6656912866303152668">Upewnij się, że <ph name="TARGET_DEVICE_NAME" /> ma w Chrome włączoną synchronizację, a potem spróbuj wysłać ponownie.</translation>
 <translation id="6699343763173986273">Następny utwór multimedialny</translation>
-<translation id="673773751041746814">Usunięcie</translation>
 <translation id="6779314412797872738">Aby przesłać stąd numer na swój telefon z Androidem, <ph name="TROUBLESHOOT_LINK" /> obu urządzeń w ustawieniach.</translation>
 <translation id="6786750046913594791">Zamknij folder</translation>
 <translation id="6808150112686056157">Zatrzymaj multimedia</translation>
diff --git a/ui/strings/translations/ui_strings_pt-BR.xtb b/ui/strings/translations/ui_strings_pt-BR.xtb
index 387e7cc..42d23e9 100644
--- a/ui/strings/translations/ui_strings_pt-BR.xtb
+++ b/ui/strings/translations/ui_strings_pt-BR.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Central de Notificações: <ph name="UNREAD_NOTIFICATION_COUNT" /> notificações não lidas</translation>
 <translation id="4730374152663651037">USADOS FREQUENTEMENTE</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 mês restante}one{# mês restante}other{# meses restantes}}</translation>
-<translation id="4841881773802181781">Inserção</translation>
 <translation id="4881695831933465202">Abrir</translation>
 <translation id="4888938634149558681">Ligar</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{Um segundo}one{# segundos}other{# segundos}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Salvar arquivo</translation>
 <translation id="6656912866303152668">Verifique se a sincronização do <ph name="TARGET_DEVICE_NAME" /> está ativada no Chrome e tente novamente.</translation>
 <translation id="6699343763173986273">Próxima faixa da mídia</translation>
-<translation id="673773751041746814">Exclusão</translation>
 <translation id="6779314412797872738">Para enviar um número daqui para seu smartphone Android, <ph name="TROUBLESHOOT_LINK" /> para os dois dispositivos nas configurações.</translation>
 <translation id="6786750046913594791">Fechar pasta</translation>
 <translation id="6808150112686056157">Parar mídia</translation>
diff --git a/ui/strings/translations/ui_strings_pt-PT.xtb b/ui/strings/translations/ui_strings_pt-PT.xtb
index 133523af..f0f3aa1 100644
--- a/ui/strings/translations/ui_strings_pt-PT.xtb
+++ b/ui/strings/translations/ui_strings_pt-PT.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Centro de notificações, <ph name="UNREAD_NOTIFICATION_COUNT" /> notificações não lidas</translation>
 <translation id="4730374152663651037">UTILIZADAS FREQUENTEMENTE</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{Falta 1 mês}other{Faltam # meses}}</translation>
-<translation id="4841881773802181781">Inserção</translation>
 <translation id="4881695831933465202">Abrir</translation>
 <translation id="4888938634149558681">Efetuar chamada</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 segundo}other{# segundos}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Guardar ficheiro</translation>
 <translation id="6656912866303152668">Certifique-se de que o <ph name="TARGET_DEVICE_NAME" /> tem a sincronização ativada no Chrome e, em seguida, tente enviar novamente.</translation>
 <translation id="6699343763173986273">Faixa seguinte de multimédia</translation>
-<translation id="673773751041746814">Eliminação</translation>
 <translation id="6779314412797872738">Para enviar um número daqui para o seu telemóvel Android, <ph name="TROUBLESHOOT_LINK" /> para ambos os dispositivos nas definições.</translation>
 <translation id="6786750046913594791">Fechar pasta</translation>
 <translation id="6808150112686056157">Parar multimédia</translation>
diff --git a/ui/strings/translations/ui_strings_ro.xtb b/ui/strings/translations/ui_strings_ro.xtb
index ed63543..1a5050e8 100644
--- a/ui/strings/translations/ui_strings_ro.xtb
+++ b/ui/strings/translations/ui_strings_ro.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Centrul de notificări, <ph name="UNREAD_NOTIFICATION_COUNT" /> notificări necitite</translation>
 <translation id="4730374152663651037">FOLOSITE FRECVENT</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 lună rămasă}few{# luni rămase}other{# de luni rămase}}</translation>
-<translation id="4841881773802181781">Inserare</translation>
 <translation id="4881695831933465202">Deschide</translation>
 <translation id="4888938634149558681">Apelează</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{o secundă}few{# secunde}other{# de secunde}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Salvează fișierul</translation>
 <translation id="6656912866303152668">Asigură-te că dispozitivul <ph name="TARGET_DEVICE_NAME" /> are sincronizarea activată în Chrome, apoi încearcă să trimiți din nou.</translation>
 <translation id="6699343763173986273">Melodia următoare din conținutul media</translation>
-<translation id="673773751041746814">Ștergere</translation>
 <translation id="6779314412797872738">Pentru a trimite un număr de aici pe telefonul Android, <ph name="TROUBLESHOOT_LINK" /> pentru ambele dispozitive din setări.</translation>
 <translation id="6786750046913594791">Închideți dosarul</translation>
 <translation id="6808150112686056157">Opriți conținutul media</translation>
diff --git a/ui/strings/translations/ui_strings_ru.xtb b/ui/strings/translations/ui_strings_ru.xtb
index fbc56de..0257ffb 100644
--- a/ui/strings/translations/ui_strings_ru.xtb
+++ b/ui/strings/translations/ui_strings_ru.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Центр уведомлений. Непрочитанных: <ph name="UNREAD_NOTIFICATION_COUNT" />.</translation>
 <translation id="4730374152663651037">ЧАСТО ИСПОЛЬЗУЕМЫЕ</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{остался 1 месяц}one{остался # месяц}few{осталось # месяца}many{осталось # месяцев}other{осталось # месяца}}</translation>
-<translation id="4841881773802181781">Вставка</translation>
 <translation id="4881695831933465202">Открыть</translation>
 <translation id="4888938634149558681">Позвонить</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 секунда}one{# секунда}few{# секунды}many{# секунд}other{# секунды}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Сохранить файл</translation>
 <translation id="6656912866303152668">Проверьте, включена ли в Chrome на устройстве <ph name="TARGET_DEVICE_NAME" /> синхронизация. Затем повторите попытку.</translation>
 <translation id="6699343763173986273">Следующий трек</translation>
-<translation id="673773751041746814">Удаление</translation>
 <translation id="6779314412797872738">Чтобы отправить номер на телефон Android, <ph name="TROUBLESHOOT_LINK" /> в настройках обоих устройств.</translation>
 <translation id="6786750046913594791">Закрыть папку.</translation>
 <translation id="6808150112686056157">Остановить</translation>
diff --git a/ui/strings/translations/ui_strings_sk.xtb b/ui/strings/translations/ui_strings_sk.xtb
index 35ba8cb6..9e214e4 100644
--- a/ui/strings/translations/ui_strings_sk.xtb
+++ b/ui/strings/translations/ui_strings_sk.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Centrum upozornení – počet neprečítaných upozornení: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation>
 <translation id="4730374152663651037">ČASTO POUŽÍVANÉ</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{zostáva 1 mesiac}few{zostávajú # mesiace}many{zostáva # mesiaca}other{zostáva # mesiacov}}</translation>
-<translation id="4841881773802181781">Vloženie</translation>
 <translation id="4881695831933465202">Otvoriť</translation>
 <translation id="4888938634149558681">Volať</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekunda}few{# sekundy}many{# sekundy}other{# sekúnd}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Uložiť súbor</translation>
 <translation id="6656912866303152668">Skontrolujte, či má <ph name="TARGET_DEVICE_NAME" /> v Chrome zapnutú synchronizáciu, a skúste to odoslať znova.</translation>
 <translation id="6699343763173986273">Média – ďalšia stopa</translation>
-<translation id="673773751041746814">Odstránenie</translation>
 <translation id="6779314412797872738">Ak chcete odtiaľto odoslať číslo do telefónu s Androidom, <ph name="TROUBLESHOOT_LINK" /> pre obidve zariadenia v nastaveniach.</translation>
 <translation id="6786750046913594791">Zatvoriť priečinok</translation>
 <translation id="6808150112686056157">Médiá – zastaviť</translation>
diff --git a/ui/strings/translations/ui_strings_sl.xtb b/ui/strings/translations/ui_strings_sl.xtb
index d13e7843..2d31e91 100644
--- a/ui/strings/translations/ui_strings_sl.xtb
+++ b/ui/strings/translations/ui_strings_sl.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Središče za obvestila, št. neprebranih sporočil: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation>
 <translation id="4730374152663651037">POGOSTO UPORABLJENE</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{Še 1 mesec}one{Še # mesec}two{Še # meseca}few{Še # mesece}other{Še # mesecev}}</translation>
-<translation id="4841881773802181781">Vstavljanje</translation>
 <translation id="4881695831933465202">Odpri</translation>
 <translation id="4888938634149558681">Pokliči</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 s}one{# s}two{# s}few{# s}other{# s}}</translation>
@@ -164,7 +163,6 @@
 <translation id="6620110761915583480">Shrani datoteko</translation>
 <translation id="6656912866303152668">Poskrbite, da ima naprava <ph name="TARGET_DEVICE_NAME" /> vklopljeno sinhronizacijo v Chromu, nato poskusite poslati znova.</translation>
 <translation id="6699343763173986273">Naslednja skladba</translation>
-<translation id="673773751041746814">Brisanje</translation>
 <translation id="6779314412797872738">Če želite poslati številko iz te naprave v telefon Android, v nastavitvah obiščite to povezavo za odpravljanje težav za obe napravi: <ph name="TROUBLESHOOT_LINK" />.</translation>
 <translation id="6786750046913594791">Zapri mapo</translation>
 <translation id="6808150112686056157">Ustavitev</translation>
diff --git a/ui/strings/translations/ui_strings_sr.xtb b/ui/strings/translations/ui_strings_sr.xtb
index 5616728..c307c0fc 100644
--- a/ui/strings/translations/ui_strings_sr.xtb
+++ b/ui/strings/translations/ui_strings_sr.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Центар за обавештења, непрочитаних обавештења: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation>
 <translation id="4730374152663651037">ЧЕСТО КОРИШЋЕНЕ</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{Још 1 месец}one{Још # месец}few{Још # месеца}other{Још # месеци}}</translation>
-<translation id="4841881773802181781">Уметање</translation>
 <translation id="4881695831933465202">Отвори</translation>
 <translation id="4888938634149558681">Позови</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 секунда}one{# секунда}few{# секунде}other{# секунди}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Чување датотеке</translation>
 <translation id="6656912866303152668">Уверите се да је синхронизација за <ph name="TARGET_DEVICE_NAME" /> укључена на Chrome-у и пробајте да пошаљете поново.</translation>
 <translation id="6699343763173986273">Следећа песма медија</translation>
-<translation id="673773751041746814">Брисање</translation>
 <translation id="6779314412797872738">Да бисте послали број са овог уређаја на Android телефон, <ph name="TROUBLESHOOT_LINK" /> за оба уређаја у подешавањима.</translation>
 <translation id="6786750046913594791">Затворите директоријум</translation>
 <translation id="6808150112686056157">Заустављање медија</translation>
diff --git a/ui/strings/translations/ui_strings_sv.xtb b/ui/strings/translations/ui_strings_sv.xtb
index 1592c94..81814a7 100644
--- a/ui/strings/translations/ui_strings_sv.xtb
+++ b/ui/strings/translations/ui_strings_sv.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507"><ph name="UNREAD_NOTIFICATION_COUNT" /> olästa aviseringar i meddelandecentret</translation>
 <translation id="4730374152663651037">OFTA ANVÄNDA</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 månad kvar}other{# månader kvar}}</translation>
-<translation id="4841881773802181781">Infogning</translation>
 <translation id="4881695831933465202">Öppna</translation>
 <translation id="4888938634149558681">Ring</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekund}other{# sekunder}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Spara fil</translation>
 <translation id="6656912866303152668">Kontrollera att synkronisering är aktiverat i Chrome på <ph name="TARGET_DEVICE_NAME" /> och försök skicka igen.</translation>
 <translation id="6699343763173986273">Nästa spår</translation>
-<translation id="673773751041746814">Borttagning</translation>
 <translation id="6779314412797872738"><ph name="TROUBLESHOOT_LINK" /> i inställningarna för båda enheterna om du vill skicka ett nummer till Android-telefonen härifrån.</translation>
 <translation id="6786750046913594791">Stäng mappen</translation>
 <translation id="6808150112686056157">Stoppa</translation>
diff --git a/ui/strings/translations/ui_strings_sw.xtb b/ui/strings/translations/ui_strings_sw.xtb
index 67552d4..66ab379 100644
--- a/ui/strings/translations/ui_strings_sw.xtb
+++ b/ui/strings/translations/ui_strings_sw.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Kituo cha Arifa, arifa <ph name="UNREAD_NOTIFICATION_COUNT" /> ambazo hujasoma</translation>
 <translation id="4730374152663651037">ZINAZOTUMIKA SANA</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{Umesalia mwezi 1}other{Imesalia miezi #}}</translation>
-<translation id="4841881773802181781">Uwekaji</translation>
 <translation id="4881695831933465202">Fungua</translation>
 <translation id="4888938634149558681">Piga simu</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{Sekunde 1}other{Sekunde #}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Hifadhi Faili</translation>
 <translation id="6656912866303152668">Hakikisha kwamba umewasha kipengele cha usawazishaji katika <ph name="TARGET_DEVICE_NAME" /> kwenye Chrome kisha ujaribu kutuma tena.</translation>
 <translation id="6699343763173986273">Wimbo Unaofuata kwenye Media</translation>
-<translation id="673773751041746814">Ufutaji</translation>
 <translation id="6779314412797872738">Ili utume nambari kutoka hapa hadi kwenye simu yako ya Android, <ph name="TROUBLESHOOT_LINK" /> kwenye vifaa vyote viwili katika mipangilio.</translation>
 <translation id="6786750046913594791">Funga Folda</translation>
 <translation id="6808150112686056157">Simamisha Media</translation>
diff --git a/ui/strings/translations/ui_strings_ta.xtb b/ui/strings/translations/ui_strings_ta.xtb
index 9c18310..7a7e4c2 100644
--- a/ui/strings/translations/ui_strings_ta.xtb
+++ b/ui/strings/translations/ui_strings_ta.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">அறிவிப்பு மையம், <ph name="UNREAD_NOTIFICATION_COUNT" /> படிக்காத அறிவிப்புகள்</translation>
 <translation id="4730374152663651037">அடிக்கடிப் பயன்படுத்தியவை</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 மாதம் உள்ளது}other{# மாதங்கள் உள்ளன}}</translation>
-<translation id="4841881773802181781">செருகும்</translation>
 <translation id="4881695831933465202">திற</translation>
 <translation id="4888938634149558681">அழை</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 நொடி}other{# நொடிகள்}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">கோப்பைச் சேமி</translation>
 <translation id="6656912866303152668"><ph name="TARGET_DEVICE_NAME" /> சாதனம் Chromeமுடன் ஒத்திசைவை இயக்கியுள்ளதா என்பதை உறுதி செய்த பின்னர் மீண்டும் அனுப்பவும்.</translation>
 <translation id="6699343763173986273">ஊடகத்தின் அடுத்த டிராக்</translation>
-<translation id="673773751041746814">நீக்கும்</translation>
 <translation id="6779314412797872738">இங்கே இருந்து உங்கள் Android மொபைலுக்கு எண்ணை அனுப்ப இரு சாதனங்களிலும் உள்ள அமைப்புகளுக்குச் சென்று <ph name="TROUBLESHOOT_LINK" />.</translation>
 <translation id="6786750046913594791">கோப்புறையை மூடு</translation>
 <translation id="6808150112686056157">ஊடகத்தை நிறுத்து</translation>
diff --git a/ui/strings/translations/ui_strings_te.xtb b/ui/strings/translations/ui_strings_te.xtb
index 3ad4bcb..c56d7c5 100644
--- a/ui/strings/translations/ui_strings_te.xtb
+++ b/ui/strings/translations/ui_strings_te.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">నోటిఫికేషన్ కేంద్రం, <ph name="UNREAD_NOTIFICATION_COUNT" /> చదవని నోటిఫికేషన్‌లు</translation>
 <translation id="4730374152663651037">తరచుగా ఉపయోగించేవి</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 నెల మిగిలి ఉంది}other{# నెలలు మిగిలి ఉన్నాయి}}</translation>
-<translation id="4841881773802181781">చొప్పించడం</translation>
 <translation id="4881695831933465202">తెరువు</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 సెకను}other{# సెకన్లు}}</translation>
 <translation id="4971687151119236543">మీడియా మునుపటి ట్రాక్</translation>
@@ -164,7 +163,6 @@
 <translation id="6620110761915583480">ఫైల్‌ను సేవ్ చేయి</translation>
 <translation id="6656912866303152668">Chromeతో <ph name="TARGET_DEVICE_NAME" /> సింక్ చేయబడి ఉందని నిర్ధారించుకుని, ఆపై మళ్లీ పంపే ప్రయత్నం చేయండి.</translation>
 <translation id="6699343763173986273">మీడియా తరువాత ట్రాక్</translation>
-<translation id="673773751041746814">తొలగింపు</translation>
 <translation id="6779314412797872738">దీని నుండి మీ ఫోన్‌కు Android నంబర్‌ను పంపడానికి, రెండు పరికరాలలోని సెట్టింగ్‌లలో "<ph name="TROUBLESHOOT_LINK" />".</translation>
 <translation id="6786750046913594791">ఫోల్డర్‌ను మూసివేయండి</translation>
 <translation id="6808150112686056157">మీడియా ఆపివేయి</translation>
diff --git a/ui/strings/translations/ui_strings_th.xtb b/ui/strings/translations/ui_strings_th.xtb
index 29d1c0ef..66655472 100644
--- a/ui/strings/translations/ui_strings_th.xtb
+++ b/ui/strings/translations/ui_strings_th.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">ศูนย์การแจ้งเตือนมีการแจ้งเตือนที่ยังไม่อ่าน <ph name="UNREAD_NOTIFICATION_COUNT" /> รายการ</translation>
 <translation id="4730374152663651037">แอปที่ใช้บ่อย</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{เหลือ 1 เดือน}other{เหลือ # เดือน}}</translation>
-<translation id="4841881773802181781">การแทรก</translation>
 <translation id="4881695831933465202">เปิด</translation>
 <translation id="4888938634149558681">โทรออก</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 วินาที}other{# วินาที}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">บันทึกไฟล์</translation>
 <translation id="6656912866303152668">ตรวจสอบว่าการซิงค์ <ph name="TARGET_DEVICE_NAME" /> ใน Chrome เปิดอยู่ แล้วลองส่งอีกครั้ง</translation>
 <translation id="6699343763173986273">แทร็กถัดไปของสื่อ</translation>
-<translation id="673773751041746814">การลบ</translation>
 <translation id="6779314412797872738">หากต้องการส่งหมายเลขจากอุปกรณ์นี้ไปยังโทรศัพท์ Android ให้<ph name="TROUBLESHOOT_LINK" />ของอุปกรณ์ทั้งสองในการตั้งค่า</translation>
 <translation id="6786750046913594791">ปิดโฟลเดอร์</translation>
 <translation id="6808150112686056157">หยุดสื่อ</translation>
diff --git a/ui/strings/translations/ui_strings_tr.xtb b/ui/strings/translations/ui_strings_tr.xtb
index a1037fe..4b410c40 100644
--- a/ui/strings/translations/ui_strings_tr.xtb
+++ b/ui/strings/translations/ui_strings_tr.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Bildirim Merkezi, <ph name="UNREAD_NOTIFICATION_COUNT" /> okunmamış bildirim</translation>
 <translation id="4730374152663651037">SIK KULLANILANLAR</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{1 ay kaldı}other{# ay kaldı}}</translation>
-<translation id="4841881773802181781">Ekleme</translation>
 <translation id="4881695831933465202">Aç</translation>
 <translation id="4888938634149558681">Telefon et</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 saniye}other{# saniye}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Dosyayı Kaydet</translation>
 <translation id="6656912866303152668"><ph name="TARGET_DEVICE_NAME" /> cihazının Chrome'da senkronizasyonunun açık olduğundan emin olun ve ardından tekrar göndermeyi deneyin.</translation>
 <translation id="6699343763173986273">Medya Sonraki Parça</translation>
-<translation id="673773751041746814">Silme</translation>
 <translation id="6779314412797872738">Buradan Android telefonunuza bir numara göndermek için ayarlarda her iki cihaz için <ph name="TROUBLESHOOT_LINK" />.</translation>
 <translation id="6786750046913594791">Klasörü kapat</translation>
 <translation id="6808150112686056157">Medyayı Durdur</translation>
diff --git a/ui/strings/translations/ui_strings_uk.xtb b/ui/strings/translations/ui_strings_uk.xtb
index a019cec7..27a46ac 100644
--- a/ui/strings/translations/ui_strings_uk.xtb
+++ b/ui/strings/translations/ui_strings_uk.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Центр сповіщень, непрочитаних сповіщень: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation>
 <translation id="4730374152663651037">ЧАСТО ВИКОРИСТОВУЮТЬСЯ</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{Залишився 1 місяць}one{Залишився # місяць}few{Залишилося # місяці}many{Залишилося # місяців}other{Залишилося # місяця}}</translation>
-<translation id="4841881773802181781">Вставлення</translation>
 <translation id="4881695831933465202">Відкрити</translation>
 <translation id="4888938634149558681">Зателефонувати</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 секунда}one{# секунда}few{# секунди}many{# секунд}other{# секунди}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Зберегти файл</translation>
 <translation id="6656912866303152668">Переконайтеся, що на пристрої<ph name="TARGET_DEVICE_NAME" /> увімкнено синхронізацію в Chrome, а потім спробуйте надіслати знову.</translation>
 <translation id="6699343763173986273">Наступна композиція</translation>
-<translation id="673773751041746814">Видалення</translation>
 <translation id="6779314412797872738">Щоб надіслати номер на телефон Android, <ph name="TROUBLESHOOT_LINK" /> для обох пристроїв у налаштуваннях.</translation>
 <translation id="6786750046913594791">Закрити папку</translation>
 <translation id="6808150112686056157">Зупинити</translation>
diff --git a/ui/strings/translations/ui_strings_vi.xtb b/ui/strings/translations/ui_strings_vi.xtb
index 1bbd70a..8fe1364 100644
--- a/ui/strings/translations/ui_strings_vi.xtb
+++ b/ui/strings/translations/ui_strings_vi.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">Trung tâm thông báo, <ph name="UNREAD_NOTIFICATION_COUNT" /> thông báo chưa đọc</translation>
 <translation id="4730374152663651037">SỬ DỤNG THƯỜNG XUYÊN</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{Còn 1 tháng}other{Còn # tháng}}</translation>
-<translation id="4841881773802181781">Chèn</translation>
 <translation id="4881695831933465202">Mở</translation>
 <translation id="4888938634149558681">Gọi điện</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 giây}other{# giây}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">Lưu Tệp</translation>
 <translation id="6656912866303152668">Đảm bảo bạn đã bật tính năng đồng bộ hóa của <ph name="TARGET_DEVICE_NAME" /> trong Chrome, rồi thử gửi lại.</translation>
 <translation id="6699343763173986273">Bản nhạc tiếp theo của trình phát phương tiện</translation>
-<translation id="673773751041746814">Xóa</translation>
 <translation id="6779314412797872738">Để chuyển một số điện thoại từ đây sang điện thoại Android, hãy <ph name="TROUBLESHOOT_LINK" /> cho cả hai thiết bị trong phần cài đặt.</translation>
 <translation id="6786750046913594791">Đóng thư mục</translation>
 <translation id="6808150112686056157">Dừng trình phát phương tiện</translation>
diff --git a/ui/strings/translations/ui_strings_zh-CN.xtb b/ui/strings/translations/ui_strings_zh-CN.xtb
index e125b0e..b5b7bcb 100644
--- a/ui/strings/translations/ui_strings_zh-CN.xtb
+++ b/ui/strings/translations/ui_strings_zh-CN.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">通知中心,<ph name="UNREAD_NOTIFICATION_COUNT" /> 条未读通知</translation>
 <translation id="4730374152663651037">常用应用</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{还有 1 个月的时间}other{还有 # 个月的时间}}</translation>
-<translation id="4841881773802181781">插入</translation>
 <translation id="4881695831933465202">打开</translation>
 <translation id="4888938634149558681">致电</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 秒}other{# 秒}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">保存文件</translation>
 <translation id="6656912866303152668">请确保 <ph name="TARGET_DEVICE_NAME" /> 已在 Chrome 中开启同步,然后再次尝试发送。</translation>
 <translation id="6699343763173986273">媒体下一曲</translation>
-<translation id="673773751041746814">删除</translation>
 <translation id="6779314412797872738">要在此处向您的 Android 手机发送电话号码,请在这两台设备的设置中<ph name="TROUBLESHOOT_LINK" />。</translation>
 <translation id="6786750046913594791">关闭文件夹</translation>
 <translation id="6808150112686056157">媒体停止</translation>
diff --git a/ui/strings/translations/ui_strings_zh-TW.xtb b/ui/strings/translations/ui_strings_zh-TW.xtb
index 83a1ece..e6915902 100644
--- a/ui/strings/translations/ui_strings_zh-TW.xtb
+++ b/ui/strings/translations/ui_strings_zh-TW.xtb
@@ -111,7 +111,6 @@
 <translation id="4724120544754982507">通知中心,<ph name="UNREAD_NOTIFICATION_COUNT" /> 則未讀通知</translation>
 <translation id="4730374152663651037">常用的應用程式</translation>
 <translation id="4788285488841504513">{MONTHS,plural, =1{還剩 1 個月}other{還剩 # 個月}}</translation>
-<translation id="4841881773802181781">插入</translation>
 <translation id="4881695831933465202">開啟</translation>
 <translation id="4888938634149558681">撥打電話</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 秒}other{# 秒}}</translation>
@@ -165,7 +164,6 @@
 <translation id="6620110761915583480">儲存檔案</translation>
 <translation id="6656912866303152668">請確認「<ph name="TARGET_DEVICE_NAME" />」已開啟了 Chrome 的同步功能,然後再傳送一次。</translation>
 <translation id="6699343763173986273">下一首媒體曲目</translation>
-<translation id="673773751041746814">刪除</translation>
 <translation id="6779314412797872738">如要將號碼從這個裝置傳送到你的 Android 手機,請在這兩個裝置的設定中<ph name="TROUBLESHOOT_LINK" />。</translation>
 <translation id="6786750046913594791">關閉資料夾</translation>
 <translation id="6808150112686056157">停止媒體播放</translation>
diff --git a/ui/webui/resources/cr_components/chromeos/network/BUILD.gn b/ui/webui/resources/cr_components/chromeos/network/BUILD.gn
index d2f68c0..5cfbe4e 100644
--- a/ui/webui/resources/cr_components/chromeos/network/BUILD.gn
+++ b/ui/webui/resources/cr_components/chromeos/network/BUILD.gn
@@ -52,6 +52,7 @@
   deps = [
     "//chromeos/services/network_config/public/mojom:mojom_js_library_for_compile",
     "//ui/webui/resources/cr_components/chromeos/network:mojo_interface_provider",
+    "//ui/webui/resources/cr_elements/chromeos/network:cr_network_listener_behavior",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:i18n_behavior",
   ]
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_config.html b/ui/webui/resources/cr_components/chromeos/network/network_config.html
index 505111d..9fb45a43 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_config.html
+++ b/ui/webui/resources/cr_components/chromeos/network/network_config.html
@@ -2,6 +2,7 @@
 
 <link rel="import" href="chrome://resources/cr_components/chromeos/network/mojo_interface_provider.html">
 <link rel="import" href="chrome://resources/cr_elements/action_link_css.html">
+<link rel="import" href="chrome://resources/cr_elements/chromeos/network/cr_network_listener_behavior.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html">
 <link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_indicator.html">
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_config.js b/ui/webui/resources/cr_components/chromeos/network/network_config.js
index a3316fa..23a46822 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_config.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_config.js
@@ -35,15 +35,12 @@
 Polymer({
   is: 'network-config',
 
-  behaviors: [I18nBehavior],
+  behaviors: [
+    CrNetworkListenerBehavior,
+    I18nBehavior,
+  ],
 
   properties: {
-    /**
-     * Interface for networkingPrivate calls, passed from host.
-     * @type {NetworkingPrivate}
-     */
-    networkingPrivate: Object,
-
     /** @type {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} */
     globalPolicy_: Object,
 
@@ -133,7 +130,7 @@
 
     /**
      * Used to populate the 'Server CA certificate' dropdown.
-     * @private {!Array<!chrome.networkingPrivate.Certificate>}
+     * @private {!Array<!chromeos.networkConfig.mojom.NetworkCertificate>}
      */
     serverCaCerts_: {
       type: Array,
@@ -147,7 +144,7 @@
 
     /**
      * Used to populate the 'User certificate' dropdown.
-     * @private {!Array<!chrome.networkingPrivate.Certificate>}
+     * @private {!Array<!chromeos.networkConfig.mojom.NetworkCertificate>}
      */
     userCerts_: {
       type: Array,
@@ -206,8 +203,8 @@
     },
 
     /**
-     * VPN Type from vpnTypeItems_. Combines VPN.Type and
-     * VPN.IPsec.AuthenticationType.
+     * VPN Type from vpnTypeItems_. Combines vpn.type and
+     * vpn.ipSec.authenticationType.
      * @private {VPNConfigType|undefined}
      */
     vpnType_: String,
@@ -331,19 +328,7 @@
   /** @const */
   MIN_PASSPHRASE_LENGTH: 5,
 
-  /**
-   * Listener function for chrome.networkingPrivate.onCertificateListsChanged.
-   * @type {?function()}
-   * @private
-   */
-  certificateListsChangedListener_: null,
-
-  /**
-   * This UI will use both the networkingPrivate extension API and the
-   * networkConfig mojo API until we provide all of the required functionality
-   * in networkConfig. TODO(stevenjb): Remove use of networkingPrivate api.
-   * @private {?mojom.CrosNetworkConfigRemote}
-   */
+  /** @private {?mojom.CrosNetworkConfigRemote} */
   networkConfig_: null,
 
   /** @override */
@@ -354,23 +339,11 @@
 
   /** @override */
   attached: function() {
-    this.certificateListsChangedListener_ =
-        this.onCertificateListsChanged_.bind(this);
-    this.networkingPrivate.onCertificateListsChanged.addListener(
-        this.certificateListsChangedListener_);
     this.networkConfig_.getGlobalPolicy().then(response => {
       this.globalPolicy_ = response.result;
     });
   },
 
-  /** @override */
-  detached: function() {
-    assert(this.certificateListsChangedListener_);
-    this.networkingPrivate.onCertificateListsChanged.removeListener(
-        this.certificateListsChangedListener_);
-    this.certificateListsChangedListener_ = null;
-  },
-
   init: function() {
     this.mojoType_ = undefined;
     this.vpnType_ = undefined;
@@ -503,24 +476,26 @@
     return !!this.guid;
   },
 
-  /** @private */
+  /** CrNetworkListenerBehavior override */
   onCertificateListsChanged_: function() {
-    this.networkingPrivate.getCertificateLists(function(certificateLists) {
+    this.networkConfig_.getNetworkCertificates().then(response => {
       const isOpenVpn = this.configProperties_.type == mojom.NetworkType.kVPN &&
           this.configProperties_.vpn.type == mojom.VpnType.kOpenVPN;
 
-      const caCerts = certificateLists.serverCaCertificates.slice();
+      const caCerts = response.serverCas.slice();
       if (!isOpenVpn) {
-        // 'Default' is the same as 'Do not check' except it sets
-        // eap.UseSystemCAs (which does not apply to OpenVPN).
+        // 'Default' is the same as 'Do not check' except that 'Default' sets
+        // eap.useSystemCas (which does not apply to OpenVPN).
         caCerts.unshift(this.getDefaultCert_(
+            chromeos.networkConfig.mojom.CertificateType.kServerCA,
             this.i18n('networkCAUseDefault'), DEFAULT_HASH));
       }
       caCerts.push(this.getDefaultCert_(
+          chromeos.networkConfig.mojom.CertificateType.kServerCA,
           this.i18n('networkCADoNotCheck'), DO_NOT_CHECK_HASH));
       this.set('serverCaCerts_', caCerts);
 
-      let userCerts = certificateLists.userCertificates.slice();
+      let userCerts = response.userCerts.slice();
       // Only hardware backed user certs are supported.
       userCerts.forEach(function(cert) {
         if (!cert.hardwareBacked) {
@@ -530,33 +505,39 @@
       if (isOpenVpn) {
         // OpenVPN allows but does not require a user certificate.
         userCerts.unshift(this.getDefaultCert_(
+            chromeos.networkConfig.mojom.CertificateType.kUserCert,
             this.i18n('networkNoUserCert'), NO_USER_CERT_HASH));
       }
       if (!userCerts.length) {
         userCerts = [this.getDefaultCert_(
+            chromeos.networkConfig.mojom.CertificateType.kUserCert,
             this.i18n('networkCertificateNoneInstalled'), NO_CERTS_HASH)];
       }
       this.set('userCerts_', userCerts);
 
       this.updateSelectedCerts_();
       this.updateCertError_();
-    }.bind(this));
+    });
   },
 
   /**
+   * @param {chromeos.networkConfig.mojom.CertificateType} type
    * @param {string} desc
    * @param {string} hash
-   * @return {!chrome.networkingPrivate.Certificate}
+   * @return {!chromeos.networkConfig.mojom.NetworkCertificate}
    * @private
    */
-  getDefaultCert_: function(desc, hash) {
+  getDefaultCert_: function(type, desc, hash) {
     return {
-      hardwareBacked: false,
+      type: type,
       hash: hash,
       issuedBy: desc,
       issuedTo: '',
-      isDefault: true,
-      deviceWide: false
+      pemOrId: '',
+      hardwareBacked: false,
+      // Default cert entries should always be shown, even in the login UI,
+      // so treat thiem as device-wide.
+      deviceWide: true,
     };
   },
 
@@ -860,7 +841,7 @@
 
   /**
    * Ensures that the appropriate EAP properties are created (or deleted when
-   * the EAP.Outer property changes.
+   * the eap.outer property changes.
    * @private
    */
   updateEapOuter_: function() {
@@ -885,7 +866,7 @@
       return;
     }
     const eap = this.eapProperties_;
-    const pem = eap && eap.ServerCAPEMs ? eap.ServerCAPEMs[0] : '';
+    const pem = eap && eap.serverCaPems ? eap.serverCaPems[0] : '';
     const certId =
         eap && eap.clientCertType == 'PKCS11Id' ? eap.clientCertPkcs11Id : '';
     this.setSelectedCerts_(pem, certId);
@@ -936,7 +917,7 @@
     if (opt_create) {
       return eap || {
         saveCredentials: false,
-        useSystemCas: true,
+        useSystemCas: false,
       };
     }
     return eap || null;
@@ -1059,7 +1040,7 @@
       return;
     }
     const ipSec = this.configProperties_.vpn.ipSec;
-    const pem = ipSec.serverCAPEMs && ipSec.serverCAPEMs[0];
+    const pem = ipSec.serverCaPems ? ipSec.serverCaPems[0] : undefined;
     const certId =
         ipSec.clientCertType == 'PKCS11Id' ? ipSec.clientCertPkcs11Id : '';
     this.setSelectedCerts_(pem, certId);
@@ -1119,7 +1100,7 @@
   setSelectedCerts_: function(pem, certId) {
     if (pem) {
       const serverCa = this.serverCaCerts_.find(function(cert) {
-        return cert.pem == pem;
+        return cert.pemOrId == pem;
       });
       if (serverCa) {
         this.selectedServerCaHash_ = serverCa.hash;
@@ -1129,10 +1110,10 @@
     if (certId) {
       // |certId| is in the format |slot:id| for EAP and IPSec and |id| for
       // OpenVPN certs.
-      // |userCerts_[i].PKCS11Id| is always in the format |slot:id|.
+      // |userCerts_[i].pemOrId| is always in the format |slot:id|.
       // Use a substring comparison to support both |certId| formats.
       const userCert = this.userCerts_.find(function(cert) {
-        return cert.PKCS11Id.indexOf(/** @type {string} */ (certId)) >= 0;
+        return cert.pemOrId.indexOf(/** @type {string} */ (certId)) >= 0;
       });
       if (userCert) {
         this.selectedUserCertHash_ = userCert.hash;
@@ -1143,10 +1124,10 @@
   },
 
   /**
-   * @param {!Array<!chrome.networkingPrivate.Certificate>} certs
+   * @param {!Array<!chromeos.networkConfig.mojom.NetworkCertificate>} certs
    * @param {string|undefined} hash
    * @private
-   * @return {!chrome.networkingPrivate.Certificate|undefined}
+   * @return {!chromeos.networkConfig.mojom.NetworkCertificate|undefined}
    */
   findCert_: function(certs, hash) {
     if (!hash) {
@@ -1164,25 +1145,24 @@
    * @private
    */
   updateSelectedCerts_: function() {
+    // Validate selected Server CA.
     if (!this.findCert_(this.serverCaCerts_, this.selectedServerCaHash_)) {
       this.selectedServerCaHash_ = undefined;
     }
-    if (!this.selectedServerCaHash_ ||
-        this.selectedServerCaHash_ == DEFAULT_HASH) {
-      const eap = this.eapProperties_;
-      if (eap && eap.useSystemCas === false) {
-        this.selectedServerCaHash_ = DO_NOT_CHECK_HASH;
-      }
-    }
     if (!this.selectedServerCaHash_) {
-      // For unconfigured networks only, default to the first CA if available.
-      if (!this.guid && this.serverCaCerts_[0]) {
+      const eap = this.eapProperties_;
+      if (eap) {
+        this.selectedServerCaHash_ =
+            eap.useSystemCas ? DEFAULT_HASH : DO_NOT_CHECK_HASH;
+      } else if (!this.guid && this.serverCaCerts_[0]) {
+        // For unconfigured networks only, default to the first CA.
         this.selectedServerCaHash_ = this.serverCaCerts_[0].hash;
       } else {
         this.selectedServerCaHash_ = DO_NOT_CHECK_HASH;
       }
     }
 
+    // Validate selected User cert.
     if (!this.findCert_(this.userCerts_, this.selectedUserCertHash_)) {
       this.selectedUserCertHash_ = undefined;
     }
@@ -1242,7 +1222,7 @@
       this.selectedUserCertHash_ = undefined;
     }
     cert = this.findCert_(this.serverCaCerts_, this.selectedServerCaHash_);
-    if (cert && !(cert.deviceWide || cert.isDefault)) {
+    if (cert && !cert.deviceWide) {
       this.selectedServerCaHash_ = undefined;
     }
     this.deviceCertsOnly_ = true;
@@ -1394,7 +1374,7 @@
         return false;
       }
       cert = this.findCert_(this.serverCaCerts_, this.selectedServerCaHash_);
-      if (!cert.deviceWide || !cert.isDefault) {
+      if (!cert.deviceWide) {
         return false;
       }
     }
@@ -1435,7 +1415,7 @@
     // it to true on a successful connection.
     delete propertiesToSet.autoConnect;
     if (this.guid) {
-      propertiesToSet.GUID = this.guid;
+      propertiesToSet.guid = this.guid;
     }
     const eap = this.getEap_(propertiesToSet);
     if (eap) {
@@ -1469,7 +1449,7 @@
       return [];
     }
     const serverCa = this.findCert_(this.serverCaCerts_, caHash);
-    return serverCa && serverCa.pem ? [serverCa.pem] : [];
+    return serverCa && serverCa.pemOrId ? [serverCa.pemOrId] : [];
   },
 
   /**
@@ -1483,7 +1463,7 @@
       return '';
     }
     const userCert = this.findCert_(this.userCerts_, userCertHash);
-    return (userCert && userCert.PKCS11Id) || '';
+    return (userCert && userCert.pemOrId) || '';
   },
 
   /**
@@ -1491,13 +1471,13 @@
    * @private
    */
   setEapProperties_: function(eap) {
-    eap.UseSystemCAs = this.selectedServerCaHash_ == DEFAULT_HASH;
+    eap.useSystemCas = this.selectedServerCaHash_ == DEFAULT_HASH;
 
-    eap.ServerCAPEMs = this.getServerCaPems_();
+    eap.serverCaPems = this.getServerCaPems_();
 
     const pkcs11Id = this.getUserCertPkcs11Id_();
-    eap.ClientCertType = pkcs11Id ? 'PKCS11Id' : 'None';
-    eap.ClientCertPKCS11Id = pkcs11Id || '';
+    eap.clientCertType = pkcs11Id ? 'PKCS11Id' : 'None';
+    eap.clientCertPKCS11Id = pkcs11Id || '';
   },
 
   /**
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_config_select.js b/ui/webui/resources/cr_components/chromeos/network/network_config_select.js
index 83610876..56eb8230 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_config_select.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_config_select.js
@@ -75,14 +75,15 @@
   /**
    * Returns a localized label for |item|. If |this.key| is set, |item| is
    * expected to be an enum and the key is used to convert it to a string.
-   * @param {string|number|!chrome.networkingPrivate.Certificate} item
+   * @param {string|number|!chromeos.networkConfig.mojom.NetworkCertificate}
+   *     item
    * @return {string}
    * @private
    */
   getItemLabel_: function(item) {
     if (this.certList) {
       return this.getCertificateName_(
-          /** @type {chrome.networkingPrivate.Certificate}*/ (item));
+          /** @type {chromeos.networkConfig.mojom.NetworkCertificate}*/ (item));
     }
     let value;
     if (this.key) {
@@ -105,26 +106,29 @@
   },
 
   /**
-   * @param {string|!chrome.networkingPrivate.Certificate} item
+   * @param {string|!chromeos.networkConfig.mojom.NetworkCertificate} item
    * @return {string}
    * @private
    */
   getItemValue_: function(item) {
     if (this.certList) {
-      return /** @type {chrome.networkingPrivate.Certificate}*/ (item).hash;
+      return /** @type {chromeos.networkConfig.mojom.NetworkCertificate}*/ (
+                 item)
+          .hash;
     }
     return /** @type {string} */ (item);
   },
 
   /**
-   * @param {string|!chrome.networkingPrivate.Certificate} item
+   * @param {string|!chromeos.networkConfig.mojom.NetworkCertificate} item
    * @return {boolean}
    * @private
    */
   getItemEnabled_: function(item) {
     if (this.certList) {
-      const cert = /** @type {chrome.networkingPrivate.Certificate}*/ (item);
-      if (this.deviceCertsOnly && !(cert.deviceWide || cert.isDefault)) {
+      const cert =
+          /** @type {chromeos.networkConfig.mojom.NetworkCertificate}*/ (item);
+      if (this.deviceCertsOnly && !cert.deviceWide) {
         return false;
       }
       return !!cert.hash;
@@ -133,7 +137,7 @@
   },
 
   /**
-   * @param {!chrome.networkingPrivate.Certificate} certificate
+   * @param {!chromeos.networkConfig.mojom.NetworkCertificate} certificate
    * @return {string}
    * @private
    */
diff --git a/ui/webui/resources/js/chromeos/onc_mojo.js b/ui/webui/resources/js/chromeos/onc_mojo.js
index 1bf6ecc..6bee085 100644
--- a/ui/webui/resources/js/chromeos/onc_mojo.js
+++ b/ui/webui/resources/js/chromeos/onc_mojo.js
@@ -4,9 +4,8 @@
 
 /**
  * @fileoverview Utilities supporting network_config.mojom types. The strings
- * returned here should only be used for compatibility with the
- * networkingPrivate extension API and for debugging, they are not intended to
- * be user facing.
+ * returned in the getFooTypeString methods are used for looking up localized
+ * strings and for debugging. They are not intended to be drectly user facing.
  */
 
 class OncMojo {
diff --git a/weblayer/public/java/BUILD.gn b/weblayer/public/java/BUILD.gn
index 6dc3923..6383d6a4 100644
--- a/weblayer/public/java/BUILD.gn
+++ b/weblayer/public/java/BUILD.gn
@@ -21,8 +21,8 @@
 
 android_library("java") {
   java_files = [
-    "org/chromium/weblayer/RemoteFragmentClient.java",
     "org/chromium/weblayer/BrowserController.java",
+    "org/chromium/weblayer/BrowserFragment.java",
     "org/chromium/weblayer/BrowserFragmentController.java",
     "org/chromium/weblayer/BrowserObserver.java",
     "org/chromium/weblayer/Callback.java",
diff --git a/weblayer/public/java/org/chromium/weblayer/RemoteFragmentClient.java b/weblayer/public/java/org/chromium/weblayer/BrowserFragment.java
similarity index 78%
rename from weblayer/public/java/org/chromium/weblayer/RemoteFragmentClient.java
rename to weblayer/public/java/org/chromium/weblayer/BrowserFragment.java
index 644585e4..4c199fd 100644
--- a/weblayer/public/java/org/chromium/weblayer/RemoteFragmentClient.java
+++ b/weblayer/public/java/org/chromium/weblayer/BrowserFragment.java
@@ -19,74 +19,68 @@
 import org.chromium.weblayer_private.aidl.ObjectWrapper;
 
 /**
- * Hosts a "remote fragment" (represented by {@link IRemoteFragment}) that lives in another
- * ClassLoader. The remote fragment has all the actual logic (e.g. handling lifecycle events), while
- * this class actually extends {@link Fragment}, forwarding the calls to and from the remote
- * fragment. Thus it is "hosting" the fragment implemented elsewhere.
+ * WebLayer's fragment implementation.
  */
-public final class RemoteFragmentClient extends Fragment {
+public final class BrowserFragment extends Fragment {
     private final IRemoteFragmentClient mClientImpl = new IRemoteFragmentClient.Stub() {
         @Override
         public void superOnCreate(IObjectWrapper savedInstanceState) {
-            RemoteFragmentClient.super.onCreate(ObjectWrapper.unwrap(savedInstanceState,
-                    Bundle.class));
+            BrowserFragment.super.onCreate(ObjectWrapper.unwrap(savedInstanceState, Bundle.class));
         }
 
         @Override
         public void superOnAttach(IObjectWrapper context) {
-            RemoteFragmentClient.super.onAttach(ObjectWrapper.unwrap(context, Context.class));
+            BrowserFragment.super.onAttach(ObjectWrapper.unwrap(context, Context.class));
         }
 
         @Override
         public void superOnActivityCreated(IObjectWrapper savedInstanceState) {
-            RemoteFragmentClient.super.onCreate(ObjectWrapper.unwrap(savedInstanceState,
-                    Bundle.class));
+            BrowserFragment.super.onCreate(ObjectWrapper.unwrap(savedInstanceState, Bundle.class));
         }
 
         @Override
         public void superOnStart() {
-            RemoteFragmentClient.super.onStart();
+            BrowserFragment.super.onStart();
         }
 
         @Override
         public void superOnResume() {
-            RemoteFragmentClient.super.onResume();
+            BrowserFragment.super.onResume();
         }
 
         @Override
         public void superOnPause() {
-            RemoteFragmentClient.super.onPause();
+            BrowserFragment.super.onPause();
         }
 
         @Override
         public void superOnStop() {
-            RemoteFragmentClient.super.onStop();
+            BrowserFragment.super.onStop();
         }
 
         @Override
         public void superOnDestroyView() {
-            RemoteFragmentClient.super.onDestroyView();
+            BrowserFragment.super.onDestroyView();
         }
 
         @Override
         public void superOnDetach() {
-            RemoteFragmentClient.super.onDetach();
+            BrowserFragment.super.onDetach();
         }
 
         @Override
         public void superOnDestroy() {
-            RemoteFragmentClient.super.onDestroy();
+            BrowserFragment.super.onDestroy();
         }
 
         @Override
         public void superOnSaveInstanceState(IObjectWrapper outState) {
-            RemoteFragmentClient.super.onSaveInstanceState(ObjectWrapper.unwrap(outState,
-                    Bundle.class));
+            BrowserFragment.super.onSaveInstanceState(ObjectWrapper.unwrap(outState, Bundle.class));
         }
 
         @Override
         public IObjectWrapper getActivity() {
-            return ObjectWrapper.wrap(RemoteFragmentClient.this.getActivity());
+            return ObjectWrapper.wrap(BrowserFragment.this.getActivity());
         }
     };
 
@@ -102,8 +96,8 @@
     }
 
     @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
+    public View onCreateView(
+            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         try {
             return ObjectWrapper.unwrap(mRemoteFragment.handleOnCreateView(), View.class);
         } catch (RemoteException e) {
diff --git a/weblayer/public/java/org/chromium/weblayer/BrowserFragmentController.java b/weblayer/public/java/org/chromium/weblayer/BrowserFragmentController.java
index 34b8a4d..3d928b3 100644
--- a/weblayer/public/java/org/chromium/weblayer/BrowserFragmentController.java
+++ b/weblayer/public/java/org/chromium/weblayer/BrowserFragmentController.java
@@ -18,10 +18,10 @@
  */
 public final class BrowserFragmentController {
     private final IBrowserFragmentController mImpl;
-    private final RemoteFragmentClient mFragment;
+    private final BrowserFragment mFragment;
     private BrowserController mController;
 
-    BrowserFragmentController(IBrowserFragmentController impl, RemoteFragmentClient fragment) {
+    BrowserFragmentController(IBrowserFragmentController impl, BrowserFragment fragment) {
         mImpl = impl;
         mFragment = fragment;
     }
diff --git a/weblayer/public/java/org/chromium/weblayer/Profile.java b/weblayer/public/java/org/chromium/weblayer/Profile.java
index 685bdd4..93b6e14 100644
--- a/weblayer/public/java/org/chromium/weblayer/Profile.java
+++ b/weblayer/public/java/org/chromium/weblayer/Profile.java
@@ -46,12 +46,12 @@
 
     public BrowserFragmentController createBrowserFragmentController(Context context) {
         try {
-            RemoteFragmentClient fragmentClient = new RemoteFragmentClient();
-            IBrowserFragmentController browserFragmentImpl = mImpl.createBrowserFragmentController(
-                    fragmentClient.asIRemoteFragmentClient(),
-                    ObjectWrapper.wrap(WebLayer.createRemoteContext(context)));
-            fragmentClient.setRemoteFragment(browserFragmentImpl.getRemoteFragment());
-            return new BrowserFragmentController(browserFragmentImpl, fragmentClient);
+            BrowserFragment fragment = new BrowserFragment();
+            IBrowserFragmentController browserFragmentImpl =
+                    mImpl.createBrowserFragmentController(fragment.asIRemoteFragmentClient(),
+                            ObjectWrapper.wrap(WebLayer.createRemoteContext(context)));
+            fragment.setRemoteFragment(browserFragmentImpl.getRemoteFragment());
+            return new BrowserFragmentController(browserFragmentImpl, fragment);
         } catch (RemoteException e) {
             throw new APICallException(e);
         }